Linq学习笔记(一)——Linq To Objects 预览
2009-11-14 20:08 Henry Cui 阅读(580) 评论(1) 编辑 收藏 举报Linq是C#3.0里面的东西,现在C#4.0都快出来了,有点落伍了,还是务实下基础。
必备知识:
基础数据
首先我们看一个基础数据(项目-模块-功能点)的图:
然后在BaseDate中Projects的数据(代码1.1):
- public static Projects[] ProjectList =
- {
- new Projects{ProjectsID="CAMS_NT",ProjectsName="信息系统-NT",CreateDate=new DateTime(2008,1,3)},
- new Projects{ProjectsID="CAMS_WX",ProjectsName="信息系统-WX",CreateDate=new DateTime(2008,5,3)},
- new Projects{ProjectsID="WMS",ProjectsName="仓储系统",CreateDate = new DateTime(2009,5,3)}
- };
预览Demo
现在我们需要从数组中找出ProjectsID以CAMS开头的所有的项目的项目名称。在C#2.0之前我们莫非于这样(代码1.2):
- List<string> projectnames = new List<string>();
- foreach (Projects project in BaseDate.BaseData.ProjectList)
- {
- if (project.ProjectsID.StartsWith("CAMS"))
- projectnames.Add(project.ProjectsName);
- }
- foreach (string proname in projectnames)
- {
- Console.WriteLine(proname);
- }
我们可以通过C#3.0中提供的扩展方法进行更为方便实现(代码1.3):
- var projectnames = BaseDate.BaseData.ProjectList.Where(project => project.ProjectsID.StartsWith("CAMS"))
- .Select(project => project.ProjectsName);
- foreach (var proname in projectnames)
- {
- Console.WriteLine(proname);
- }
而我们还可以通过linq更为简洁的实现(代码1.4):
- var projectnames = from project in BaseData.ProjectList
- where project.ProjectsID.StartsWith("CAMS")
- select project.ProjectsName;
- foreach (var proname in projectnames)
- {
- Console.WriteLine(proname);
- }
在代码1.2中实现就不必多说,在代码1.3中通过了扩展方法where以及select实现了过滤以及查询功能,而在代码1.4中我们看到了一种类似于sql语句的查询,这就是Linq查询表达式的语法,可以看到是多么的方便。
查询表达式的编写
- from [type] id in source
- [join [type] IDictionary in source on expr equals expr [into id]]
- {from[type] id in source |let id = expr|where condition}
- [orderby ordering,odering,...]
- select expr | group expr by key
- [into id query]
首先查询表达式从from字句开始;
最开始的from字句口可以跟多个from、let、where、join、orderby 字句;
最后以select或则group字句结束。
每个from字句都能引入一个新的变量,用来依次访问某个序列中的每个元素;每个let都会引入新的变量,用来表示前面计算出来的值;每个where字句都会过滤一些元素,每个join字句都会指定某个字段跟另外序列字段进行关联;orderby进行排序;group、select决定集合的结构。
其实在我们用linq查询表达式编写出来的代码最后都会装变成调用扩展方法的形式,所以说代码1.4跟代码1.3的本质是一样的。
查询表达式的限制
相对于扩展方法的方式,有些方法是在表达式语法中无法实现的。如:Take、Distinct。所以我们需要在扩展方法形式以及查询表达式形式的两种选择时,要按照自己的需要来。
同时还需要注意的是,所要的查询只可用于可被枚举的集合对象上:
1.数组
2.泛型列表
3.泛型字典
要注意的是Linq无法支持DataSet、ArrayList等非泛型集合。