class ShowAllUserNames
{
static void Main()//仅选择user对象名称的查询
{
IEnumerable<string> query = from user in SampleData.AllUsers
select user.Name;
//query {System.Linq.Enumerable.WhereSelectListIterator<Model.User,string>}
//我们使用user.Name作为投影,即可看到结果变为字符串序列,而不是User对象了。
//查询表达式的转换遵循与之前一样的规则,变为
//SampleData.AllUsers.Select(user => user.Name)
//编译器准许这样做,由于从Enumerable所选择的Select扩展方法实际具有如下
//签名
//static IEnumerable<TResult> Select<TSource,TResult>
// (this IEnumerable<TSource> source,
// Func<TSource,TResult> selector)
//将Lambda表达式转换为Func<TSource,TResult>的时候。
//首先根据SampleData.AllUsers的类型推断出TSource为User,这样就知道了
//Lambda表达式的参数类型,并因此将user.Name作为返回string类型的
//属性访问表达式,也就可以推断出TRsult为string。 Lambda表达式允许使用
//隐式类型参数的原因。
foreach (string name in query)
//先foreach 后 query 后 in 然后 select user.Name in都会调用user.Name
//后string name
//"Tim Trotter"
//"Tara Tutu"
//"Deborah Denton"
//"Darren Dahlia"
//"Mary Malcop"
//"Colin Carton"
{
Console.WriteLine(name);
}
}
}
public static class Users
{
public static readonly User TesterTim = new User("Tim Trotter", UserType.Tester);
public static readonly User TesterTara = new User("Tara Tutu", UserType.Tester);
public static readonly User DeveloperDeborah = new User("Deborah Denton", UserType.Developer);
public static readonly User DeveloperDarren = new User("Darren Dahlia", UserType.Developer);
public static readonly User ManagerMary = new User("Mary Malcop", UserType.Manager);
public static readonly User CustomerColin = new User("Colin Carton", UserType.Customer);
}
public static IEnumerable<User> AllUsers
{
get { return users; }
}
范围变量和重要的投影
上下文关键字 告知编译器要对数据进行的处理。 同样,数据源表达式也仅仅是普通
的C#表达式
范围变量不像其他种类的变量。在某些方面,它根本就不是变量。只能用于查询
表达式中,实际代表了从一个表达式传递给另外一个表达式的上下文信息。
它们表示了特定序列中的一个元素,而且它们被用于编译器转译中,便把其他
表达式轻易地转译为Lambda表达式
输出:
Tim Trotter
Tara Tutu
Deborah Denton
Darren Dahlia
Mary Malcop
Colin Carton