C#学习笔记 LINQ简单使用

28 篇文章 0 订阅

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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值