在向大家详细介绍Linq之前,首先让大家了解下Linq Lambda表达式,以后全面介绍Linq。
Linq Lambda表达式
接下来我们通过一个例子来看一下Linq Lambda表达式:我们现在想给ClassCollection增加一个过滤方法,方法的目的是能够过滤返回班级名称为“***一班”的集合来。
1.伟大的Microsoft又给我们提供了一种更简洁的写法,这也就是我们所说的Linq Lambda表达式了:
- private static void LambdaLinq()
- {
- var classes = GetClasses();
- string className = "***一班";
- //4 C#3.0 Lambda表达式
- var result = classes.Filter(c=> c.Name == className);
- foreach (var item in result)
- {
- Console.WriteLine(item.ID+ " " + item.Name);
- }
- }
“=>”左边的就是我们上面匿名方法的参数列表,右边的是方法里,实际上Linq Lambda表达式也可以写成如下形式:
- Class c => c.Name == className
- (Class c) => c.Name == className
- (Class c) => {return c.Name == className;}
- (x,y)=>x+y;//多参数
等等,函数的返回类型也是由编译器根据"=>"右边的表达式自动推断出来的。
而且需要提到的是由于Filter是扩展方法的缘故,而且Filter方法返回类型是ClassCollection,所以可以无限扩展下去,例如
- var result = classes.Filter( c => c.Name == className).Filter(c=>c.ID>1);
这就是扩展方法的魅力所在!
2.实际上不知不觉,我们已经实现了Linq里面的一个Where功能了,然后会发现classes这个实例会增加了很多扩展方法例如Where,OrderBy,这些方法实际上就是一些给实现了IEnumerable接口的类型的扩展方法,说白了就是针对集合类型的一些相关方法,比如过滤、排序、合并、分组等方法,这些方法的返回类型依然是IEnumerable(大家可以把光标移动到Where方法上,然后调用“转到定义”去看看这些方法的定义就明白了)当然这些方法都离不开我们的Lambda表达式做参数。
- private static void LambdaLinq()
- {
- var classes = GetClasses();
- string className = "***一班";
- //5 C#3.0里面的Where扩展方法(专门给实现了IEnumerable接口的类做扩展)
- var result = classes.Where(c => c.Name == className);
- foreach (var item in result)
- {
- Console.WriteLine(item.ID+ " " + item.Name);
- }
- }
3.这样写针对IEnumarable类型的查询其实已经不错了,微软觉得还不过瘾,又提供了我们传说中的Linq Lambda表达式
- private static void LambdaLinq()
- {
- var classes = GetClasses();
- string className = "***一班";
- //6 Linq查询表达式
- var result = from c in classes where
c.Name==className orderby c.ID select c;- foreach (var item in result)
- {
- Console.WriteLine(item.ID+" "+item.Name);
- }
- }
到这时候你还认识原来的扩展方法吗?所以说语言的抽象确实很好用,和人的思维很接近,但是我们还是要看到它的本质,其实它的本质都是面向对象的一些东西,并没有创造出一些什么新的东西来,这样我们才可以真正理解语言。
【编辑推荐】