C#学习笔记 LINQ简单使用

来源:互联网 发布:淘宝加入购物车没提醒 编辑:程序博客网 时间:2024/05/29 13:51

LINQ是C#中的一项非常好用的功能,全程是语言集成查询Language Integrated Query。LING和SQL类似,但是不仅可以查询数据库中的数据,还可以查询文件、XML、对象集合等等。要使用LINQ特性,需要引用System.Linq命名空间。

使用LINQ时,需要有一个数据源充当被查询的对象,然后需要编写LINQ查询语句,然后就是执行查询。其中数据源必须实现IEnumberable<T>接口。可以用一个简单的例子验证一下。

            List<int> array = new List<int> { 1, 2, 3, 4, 5 };            var greatThan3 =                from a in array                where a > 3                select a;            foreach (var i in greatThan3)            {                Console.Write(i + " ");            }            Console.WriteLine();

需要注意的是,LINQ默认采用延迟查询的方式,在遇到LINQ查询语句的时候,只是会保存查询方法,真正执行查询的是在后面迭代结果集的时候。这样做的好处是结果会受到数据源的影响,因此查询出来的结果一直是最新的。有时候需要强制执行查询。这时候可以对查询变量执行ToList()或者ToArray()方法,这样就会立即执行并返回查询结果。

            List<int> array = new List<int> { 1, 2, 3, 4, 5 };            var greatThan3 =                (from a in array                where a > 3                select a).ToArray();            foreach (var i in greatThan3)            {                Console.Write(i + " ");            }            Console.WriteLine();

from字句引入范围变量,这个范围变量可以在LINQ查询语句中使用,还可以用多个from引入多个数据源或者执行嵌套查询。in字句引入数据源。如果数据源没有实现泛型的IEnumberable<T>接口,那么就必须在from字句中显式添加类型名来强类型化数据源中的变量。select字句用于选择查询结果,查询结果既可以是查询表达式签名出现过的某一范围变量的计算结果,也可以是一个临时指定的匿名类型。一个查询表达式必须以select子句或者group子句结束。where子句用来筛选数据源中的数据。在一个查询表达式中可以指定多个where子句,而在一个where子句中又可以指定多个谓词。谓词就是返回值为布尔类型的表达式或者语句。如果一个where子句中有多个谓词的话,应该使用||或者&&进行分隔。

排序和分组

排序使用orderby关键字,后面跟要排序的字段和排序类型,默认是升序ascending,所以一般指定指定的都是降序desending。当对多个字段进行主次要排序的时候,可以用逗号分隔多个字段。
            int[] array = { 1, 2, 3, 100, 7, 9, 5, 10, 22, 4, 5 };            var result = from a in array                         where a > 3 && a % 2 == 0                         orderby a descending                         select a;


分组使用order by关键字,order后面是要分组的字段,by后面是要按什么来分组。用循环访问这样的结果时,需要嵌套的foreach循环,外层用户访问结果中不同的组,内层访问同组中不同的结果。这个示例返回了按奇偶数分组的查询。
            int[] array = { 1, 2, 3, 4, 5, 6, 7 };            var result = from a in array                         group a by a % 2;            foreach (var group in result)            {                foreach (var g in group)                    Console.Write(g + " ");                Console.WriteLine();            }
还可以对分组之后的组名进行查询,这时候需要into关键字指定组名。以下返回了按奇偶分组中组中元素个数大于3的查询结果。
            var result2 = from a in array                          group a by a % 2 into aGroup                          where aGroup.Count() > 3                          select aGroup;

投影

利用select子句不仅可以返回某个范围变量,还可以创造新的变量,这就是投影。投影可以只取某个类或者某几个类的字段,还可以将几个字段拼接成一个匿名类。下面是一个将两组数字按二倍数的关系投影成一个匿名类。
            int[] array1 = { 1, 2, 3, 4, 5 };            int[] array2 = { 2, 4, 6, 8, 10 };            var result = from a1 in array1                         from a2 in array2                         where a1 * 2 == a2                         select new { a = a1, b = a2 };




0 0
原创粉丝点击