Linq Lambda表达式概括

在向大家详细介绍Linq之前,首先让大家了解下Linq Lambda表达式,以后全面介绍Linq。

Linq Lambda表达式

接下来我们通过一个例子来看一下Linq Lambda表达式:我们现在想给ClassCollection增加一个过滤方法,方法的目的是能够过滤返回班级名称为“***一班”的集合来。

1.伟大的Microsoft又给我们提供了一种更简洁的写法,这也就是我们所说的Linq Lambda表达式了:

 
 
 
  1. private static void LambdaLinq()  
  2. {  
  3. var classes = GetClasses();  
  4.  
  5. string className = "***一班";  
  6.  
  7. //4 C#3.0 Lambda表达式  
  8. var result = classes.Filter(c=> c.Name == className);  
  9. foreach (var item in result)  
  10. {  
  11. Console.WriteLine(item.ID+ " " + item.Name);  
  12. }  
  13.  

“=>”左边的就是我们上面匿名方法的参数列表,右边的是方法里,实际上Linq Lambda表达式也可以写成如下形式:

 
 
 
  1. Class c => c.Name == className  
  2. (Class c) => c.Name == className  
  3. (Class c) => {return  c.Name == className;}  
  4. (x,y)=>x+y;//多参数 

等等,函数的返回类型也是由编译器根据"=>"右边的表达式自动推断出来的。

而且需要提到的是由于Filter是扩展方法的缘故,而且Filter方法返回类型是ClassCollection,所以可以无限扩展下去,例如

 
 
 
  1. var result = classes.Filter( c => c.Name == className).Filter(c=>c.ID>1); 

这就是扩展方法的魅力所在!

2.实际上不知不觉,我们已经实现了Linq里面的一个Where功能了,然后会发现classes这个实例会增加了很多扩展方法例如Where,OrderBy,这些方法实际上就是一些给实现了IEnumerable接口的类型的扩展方法,说白了就是针对集合类型的一些相关方法,比如过滤、排序、合并、分组等方法,这些方法的返回类型依然是IEnumerable(大家可以把光标移动到Where方法上,然后调用“转到定义”去看看这些方法的定义就明白了)当然这些方法都离不开我们的Lambda表达式做参数。

 
 
 
  1. private static void LambdaLinq()  
  2. {  
  3. var classes = GetClasses();  
  4. string className = "***一班";  
  5.  
  6. //5 C#3.0里面的Where扩展方法(专门给实现了IEnumerable接口的类做扩展)  
  7. var result = classes.Where(c => c.Name == className);  
  8. foreach (var item in result)  
  9. {  
  10. Console.WriteLine(item.ID+ " " + item.Name);  
  11. }  
  12.  

3.这样写针对IEnumarable类型的查询其实已经不错了,微软觉得还不过瘾,又提供了我们传说中的Linq Lambda表达式

 
 
 
  1. private static void LambdaLinq()  
  2. {  
  3. var classes = GetClasses();  
  4. string className = "***一班";  
  5.  
  6. //6 Linq查询表达式  
  7.  
  8. var result = from c in classes where 
    c.Name==className orderby c.ID select c;  
  9. foreach (var item in result)  
  10. {  
  11. Console.WriteLine(item.ID+" "+item.Name);  
  12. }  
  13.  

到这时候你还认识原来的扩展方法吗?所以说语言的抽象确实很好用,和人的思维很接近,但是我们还是要看到它的本质,其实它的本质都是面向对象的一些东西,并没有创造出一些什么新的东西来,这样我们才可以真正理解语言。

【编辑推荐】

  1. LINQ to SQL查询分析
  2. LINQ查询架构简单介绍
  3. LINQ to SQL映射关系概述
  4. LINQ To SQL对象模型浅析
  5. LINQ to SQL映射列描述
THE END