深入理解 c# 第十一章 仅选择user对象的查询 范围变量和重要的投影

    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


猜你喜欢

转载自blog.csdn.net/eyetired/article/details/80041671