`
webcode
  • 浏览: 5940563 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

LINQ简介(二)

 
阅读更多

LINQ简介(二)

------Linq方法语法和Lambda表达式

2.1λ表达式

Lambda表达式用来实现一个匿名方法,其语法为:

(参数列表)=>语句或语句块

这是一个简单的Lambda表达式:n=>n<1000;

运算符“=>”称为λ表达式。这个表达式定义了一个方法(函数),其参数是n,如果n小于1000,该方法就返回ture,否则返回false。该方法是一个没有名称的匿名方法,仅在把λ表达式传给Linq方法时使用。

2.2λ表达式在Linq中的使用

用Linq完成同一任务有多种方式,但通常需要通过编程来实现。如上一章内容是使用Linq查询语法编写的。本章内容将重点介绍Linq的方法语法。

Linq拥有一系列扩展方法,用于集合、数组、查询结果等对象,不在需要from…where…select子句。回顾上一章内容的示例:

varresult=fromninnameswheren.StartsWith("s")selectn;

现在可以用方法语法来实现:

varresult=names.Where(n=>n.StartsWith("s"));

C#编译器把λ表达式编译成一个匿名方法,where()在names数组中的每一个元素上执行这个方法。如果λ表达式给某个元素返回true,该元素就包含在Where()返回的结果集中。

查询语法是Linq中编写查询的首选方式,但是一定要基本了解方法语法,因为一些Ling功能不能通过查询语法来使用,或者说使用方法语法比较简单。

2.2.1用方法语法排序

对刚才的查询结果排序可以使用如下语句:

varresult=names.OrderBy(n=>n).Where(n=>n.StartsWith("s"));

或者:

varresult=names.Where(n=>n.StartsWith("s")).OrderBy(n=>n);

方法调用的顺序不是固定的,只要Linq方法返回值为IEnumerable类型即可,可以按照容易理解的方式来使用。此规则适合于以后讲到的其他方法。

OrderBy()方法需要传入一个λ表达式用来告诉它用于排序的方法是什么,我们传送了最简单的λ表达式n=>n,因为只需要按照元素本身排序。还可以向上一章所讲那样按照最后一个字母进行排序,传给OrderBy()方法一个这样的表达式:n=>n.Substring(n.Length-1)

为了给元素逆序排序,可以调用OrderByDescending()方法,使用方法和OrderBy()相同。

2.2.2投射的方法语法

投射查询的方法语法版本是通过把Linq方法Select()的调用关联到我们调用的其他Linq方法上来实现的。例如要实现上一章示例五的功能,代码如下:

varresult=list.Where(stu=>stu.Age==18).Select(stu=>new{stu.Name,stu.Age,stu.Class});

Select()方法用于方法语法的投射。

常见错误:

varresult=list.Select(stu=>newstu.Name,stu.Age,

stu.Class}).Where(stu=>stu.Sex==’男’);

虽说方法的调用顺序不固定,但根据查询的特性,不适用与上面的查询。因为Sex属性并不包含在Select()投射创建的匿名类型(stu.Name,stu.Age,stu.Class)中,所以上述代码会在Where()方法上得到一个编译错误---匿名类型不包含Sex的定义。改成如下写法是正确的。

varresult=list.Select(stu=>newstu.Name,stu.Age,

stu.Class}).Where(stu=>stu.Class==’50’);

2.2.3AnyAll

我们常常需要的另一类查询是确定数据是否满足某个条件,或者确保所有的数据都满足某个条件。例如,需要确定某个产品是否没有货了(库存为0)。

Linq提供了两个布尔方法:Any()和All(),它们可以快速确定对于数据而言,某个条件是true还是false。如下面示例所示:

boolanyStu=list.Any(stu=>stu.Sex=="");

if(anyStu)

{

Console.WriteLine("学员中有男同学");

}

else

{

Console.WriteLine("学员中没有男同学");

}

boolallStu=list.All(stu=>stu.Sex=="");

if(allStu)

{

Console.WriteLine("学员中全部是男同学");

}

else

{

Console.WriteLine("学员中不全是男同学");

}

运行结果:

2.2.4ThenBy-----多级排序

使用方法语法进行多级排序时,后台的操作比较复杂,它使用了ThenBy()和OrderBy()方法。示例代码如下:

varresult=list.OrderBy(stu=>stu.Class)

.ThenBy(stu=>stu.Age)

.ThenBy(stu=>stu.Name)

.Select(stu=>new{stu.Name,stu.Age,stu.Class});

多字段列表可以用在查询语法的OrderBy子句中。但在方法语法中第一项排序字段必须使用OrderBy()方法,随后使用ThenBy()方法。

如果第一个字段是以降序排序,需要使用OrderByDescending()方法,其他字段降序排序需要使用ThenByDescending()方法。

2.2.5TakeSkip

Take()方法对应SQL语句中的Top运算符。

Take()方法相反的是Skip()方法,它可以跳过前n个结果,返回剩余的结果。

Take()和Skip()在Linq中成为分区运算符。

varresult=list.OrderBy(stu=>stu.Age);

Console.WriteLine("年龄最小的两名学员是:");

foreach(varstuinresult.Take(2))

{

Console.WriteLine(stu);

}

Console.WriteLine("其他学员依次为:");

foreach(varstuinresult.Skip(2))

{

Console.WriteLine(stu);

}

运行结果:

2.2.6FirstFirstOrDefault

First()方法用来查找集合中第一个匹配的元素,如果没有找到匹配的结果则会引发一个异常。可以使用FirstOrDefault()方法避免异常的发生。

示例代码:

Console.WriteLine("姓名为lisi的同学信息:");

Console.WriteLine(list.First(stu=>stu.Name=="lisi"));

Console.WriteLine("姓名为hanjiu的同学信息:");

Console.WriteLine(list.FirstOrDefault(stu=>stu.Name=="hanjiu"));

FirstOrDefault()方法若没有找到则返回有一个空。

2.2.7集运算符

Linq提供了标准的集运算符,如Union()和Intersect(),对查询结果执行操作,上一章的Distinct()也是一个集运算符。

下面定义一个分数类

classScore

{

publicintID{get;set;}

publicintscore{get;set;}

}

示例代码:

staticvoidMain(string[]args)

{

List<Student>list=newList<Student>{

newStudent{ID=1,Name="zhangsan",Sex="",Age=18,Class=50},

newStudent{ID=2,Name="lisi",Sex="",Age=18,Class=50},

newStudent{ID=3,Name="wuangwu",Sex="",Age=20,Class=51},

newStudent{ID=4,Name="zhaoliu",Sex="",Age=20,Class=52},

newStudent{ID=5,Name="zhouqi",Sex="",Age=21,Class=52},

newStudent{ID=6,Name="wangba",Sex="",Age=20,Class=52}

};

List<Score>Scores=newList<Score>{

newScore{ID=1,score=80},

newScore{ID=2,score=90},

newScore{ID=3,score=70},

newScore{ID=4,score=60},

newScore{ID=5,score=50},

newScore{ID=7,score=40}};

varstudent=fromsinlistselects.ID;

varscore=fromscrinScoresselectscr.ID;

varstuWithScore=student.Intersect(score);

Console.WriteLine("有成绩的学员编号为:");

foreach(variteminstuWithScore)

{

Console.WriteLine(item);

}

Console.WriteLine("未知学员的成绩编号为:");

varscoreNoStu=score.Except(student);

foreach(variteminscoreNoStu)

{

Console.WriteLine(item);

}

Console.WriteLine("所有的编号为:");

varallID=score.Union(student);

foreach(variteminallID)

{

Console.WriteLine(item);

}

}

Intersect()查找在Student结果中有成绩的学员编号,

Except()用于查找没有匹配学员的成绩编号

Union()预算法用于查找两个结果的并集,要删除重复项

集运算符要求集成员有相同的类型才能确保得到希望的结果。

2.2.8Join查询

Join可以用一个查询搜索两个列表中相关的数据,用关键字段把结果连接起来。类似于SQLjoin(内连接)操作。如:

varresult=fromstuinlistjoinscrinScoresonstu.IDequalsscr.IDselectnew{stu.ID,stu.Name,scr.score};

foreach(varssinresult)

{

Console.WriteLine(ss);

}

分享到:
评论

相关推荐

    LINQ 实战 7/11

    第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 ...

    LINQ 实战 1/11

    第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 ...

    LINQ 实战 3/11

    第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 ...

    LINQ 实战 4/11

    第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 ...

    LINQ 实战 2/11

    第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 ...

    LINQ 实战 11/11

    第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 ...

    LINQ 实战 5/11

    第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 ...

    LINQ 实战 6/11

    第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 ...

    LINQ 实战 8/11

    第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 ...

    LINQ 实战 10/11

    第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 ...

    LINQ 实战 9/11

    第1章 LINQ简介 2 1.1 LINQ是什么 2 1.1.1 概览 3 1.1.2 LINQ的功能 3 1.1.3 作为语言扩展的LINQ 4 1.2 为什么需要LINQ 6 1.2.1 常见问题 6 1.2.2 解决理念上的失调 8 1.2.3 LINQ给出解决方案 12 ...

    Linq To Sql进阶系列.pdf

    Linq To Sql 进阶系列(二)M:M关系 Linq To Sql 进阶系列(三)CUD 和 Log 3.1 CreateDatabase 3.2 Insert 记录 3.2.1 3.2.2 3.2.3 3.3 Update 3.4 Delete 3.5 Log 3.6 更新时的冲突和事务 Linq To Sql 进阶系列...

    Visual C# 2008大学教程(第3版) 第二部分

    两个部分,用winmount压缩的 《Visual C# 2008大学教程(第3版)(英文版)》:基础知识 NET 3、5、类型、数组、LINQ to ...作者简介 作者:(美国)戴特尔(Deitel.P.J.) (美国)戴特尔(Deitel.H.M.)

    《Visual C# 2008大学教程 第3版》.(刘文红).[PDF]&ckook.pdf

    第9章 LINQ与泛型集合简介 第10章 再论类与对象 第11章 面向对象编程:继承 第12章 多态、接口与运算符重载 第13章 异常处理 第14章 图形用户界面观念:第一部分 第15章 图形用户界面观念:第二部分 第16章 GUI与...

    ASP.NET3.5从入门到精通

    8.1.4 LINQ 数据源控件(LinqDataSource) 8.1.5 Xml 数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) 8.2 重复列表控件(Repeater) 8.3 数据列表控件(DataList) 8.4 数据列表控件...

    ASP.NET 3.5 开发大全11-15

    8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) 8.2 重复列表控件(Repeater) 8.3 数据列表控件(DataList) 8.4 数据列表控件(GridView...

    ASP.NET 3.5 开发大全

    8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) 8.2 重复列表控件(Repeater) 8.3 数据列表控件(DataList) 8.4 数据列表控件(GridView...

    ASP.NET 3.5 开发大全1-5

    8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) 8.2 重复列表控件(Repeater) 8.3 数据列表控件(DataList) 8.4 数据列表控件(GridView...

Global site tag (gtag.js) - Google Analytics