C#的LINQ

  在过去如果我们如果需要去查询某些集合或者数组里面的某些元素,我们需要写出大量的带有筛选的遍历集合的代码,但是有了Linq之后,我们就不用写出那些冗余麻烦的遍历代码,只需要关注其中的筛选,排列的函数就可以实现了。Linq的语法看上去有点像SQL,完成的功能也和SQL相似,但是面向的数据不同且写法上也略有不同,下面介绍一下基本的使用。

  下面是一个使用的场景,要求从下面的名字中筛选出长度大于4的名字。

string[] names = new string[]{"zhang","li","liang","liao","cai","lie","gan","xian","lu","wang","chen"};

  那么我们在Linq上可以那么去做查询语句。

var result = from n in names 
             where n.Length > 4
             select n;

  其中var这个选项,编译器会自动帮我们识别这是一个string的数组,from n是給查询数组中的子元素起个别名,类似于foreach中的创建一个局部变量,in names是指明查询的数据源,where语句是对其中的子元素进行筛选,如果n的长度大于4,那么就会返回那个子元素到查询数组里,select子句指明结果集中包含哪些元素,这是一个必须的查询语句。

  最后我们添加一段查询代码查看结果

foreach (string r in result) {
    Console.WriteLine(r);
}

  得出的结果正符合我们所想的,如果上面的foreach查询语句不执行,那么这个linq语句就不会执行,这称为查询的延迟执行

  其实Linq语句本质上是对实现了IEnumerable的接口的对象进行操作,而所有的数组和集合都实现了这个接口。下面介绍一下Linq常用的方法。

1.where

  where用于筛选数据源中的元素,只要给他指定数据源中的子元素的任意布尔值类型的表达式就可以了,例如字符串常用筛选布尔值返回表达式的如下:

n.Length > 4
n.Startwith("z");
n.Contains("h");

  where不是必须Linq使用里面必须指定的选项,但一般都要用到。

2.orderby

  类似于SQL,在对数据进行筛选之后,我们还可以进一步地对数据进行排序。

from n in names
where n.Length > 4
orderby n
select n;

  如果是倒叙排列,则需要在后面加descending。

orderby n descending

  如果我们这个数组元素不是单纯的字符串,而是一个学生对象,那个对象有学号,名字,我们要根据学号去排名,现在该怎么做呢?

orderby s.id

   当排序的对象需要根据多个字段去排序的时候,我们可以在orderby后面去添加多个元素,已,隔开。

orderby s.name, s.id

 3.聚合函数

  和SQL一样,Linq也有Max(),Min(),Count(),Sum(),Average()这些聚合函数,继续沿用上面的学生对象例子,聚合函数需要在Linq表达式之后输出使用。

var r = from s in students
        where s.name.Length >3
        orderby s.name descending
        select s;
Console.Write("总数"+r.Count());
Console.Write("最高成绩"+r.Max(s => s.source));  //使用Lambda表达式指定返回学生的成绩
Console.Write("最低成绩"+r.Min(s => s.source));
Console.Write("总成绩"+r.sum(s => s.source));    
Console.Write("平均成绩"+r.Average(s => s.source));

 4.select

  select可以用以指定查询的具体字段,如只查询学生的学号,但是无法像SQL那样查询多个字段。

var r = from s in students
        where s.name.Length >3
        select s.id;

5.Take和Skip

  Take和Skip可以用以进行前几个数据的筛选,一般用的场景如有查询最高成绩的学生,对查出来的信息进行分页。

  Take用来表明获取几个的数据,Skip用来省略前几项的数据,指偏移量,和MySQL的Limit的意思是一样的。

//取出成绩最高的三位学生
var result = (from s in students
             orderby s.source descending
             select s.source).Take(3);
//根据id查出学生信息,每页显示5个,当前是第2页
var result = (from s in students
             orderby s.id
             select s.source).Skip(1*5).Take(5);

 

posted @ 2017-05-25 13:30  {-)大傻逼  阅读(1209)  评论(0编辑  收藏  举报
欢迎转载,转载请注明本文地址。