`
sangei
  • 浏览: 329580 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

linq和lambda表达式

阅读更多

           linq是什么呢?

          LINQ,语言集成查询(Language Integrated Query),他提供N多查询方法,基本的是select(),where(),orderby()groupby()这几种,是不是很熟悉,sql中不是也有吗?那么他们有什么区别吗?下面再说.

 

先从一个简单的实例上理解一下linq是如何使用的.

如实现这个功能:从 numbers 数组中提取偶数并降序排列

以前是这么做的

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. int[]numbers = new int[] { 6, 4, 3, 2, 9, 1, 7, 8, 5 };  
  2. List<int>even = new List<int>();  
  3. foreach(int number in numbers)  
  4. {  
  5.     if (number % 2 == 0)  
  6.     {  
  7.         even.Add(number);  
  8.     }  
  9. }  
  10. even.Sort();  
  11. even.Reverse();  

 

           linq你就可以这样实现了,简洁了很多

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. int[]numbers = new int[] { 6, 4, 3, 2, 9, 1, 7, 8, 5 };  
  2. var even= numbers  
  3.     .Where(p => p % 2 == 0)  
  4.     .Select(p => p)  
  5.     .OrderByDescending(p => p);  

 

    上面的那段代码解释就是,第一行就是new一个数组,并赋值。然后对于数组numbers进行where操作,p%2==0也就是偶数,在这里p就是numbers数组中某一个数,如果是一个对象集合,那么p就是一个对象。select操作p=>p,就是返回整个p,这个是数值看不大出来,如果是对象的话,对象有很多属性,你就可以选择返回某些属性如p=>p.id.最后一句就是根据根据p值倒序排序.

    p=>p,就是lambda表达式.lambda表达式本质上就是一个匿名方法,而且是一个进一步简化的匿名方法,它依附于委托.

    它的一般形式:

   (输入参数列表)=>{语句序列}       如 x => {return x+1;}

     => :称为Lambda 运算符,读为“goesto

    它的发展过程是在C#1.0中使用的委托,C#2.0中添加了匿名方法,C#3.0中添加了lambda表达式.

         C#1.0

        首先定义一个委托:

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. delegatestring ProcessString( string input );  

 

       委托的实例化和使用,

       有一个方法LowerIt,用于将输入的值,转为小写.

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. privatestring LowerIt(string input)  
  2. {  
  3.     return input.ToLower();  
  4. }  

 

       实例化委托,此时委托p就是这个LowerIt()方法.委托的实例化就是将委托变量p指向了LowerIt()方法,所以调用p("ABCD")也就是调用LowerIt("ABCD")

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. ProcessStringp = new ProcessString( LowerIt );  
  2. Console.WriteLine(p("ABCD"));  

 

        在C#2.0,添加了匿名方法特性

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. delegatestring ProcessString( string input );  
  2. // 匿名方法方式,这里就没有上面的LowerIt这个方法名了.  
  3. ProcessStringp = delegatestring input )  
  4. {  
  5.     return input.ToLower();  
  6. };  
  7. Console.WriteLine(p("ABCD"));  

 

         而在C#3.0中使用简洁的lamdba表达式,上段代码就可以变为这样.

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. delegatestring ProcessString( string input );  
  2. // Lambda 表达式方式,p还是用于将input转为小写  
  3. ProcessStringp = input => input.ToLower();  
  4. Console.WriteLine(p("ABCD"));<span style="font-family: Calibri; "> </span>  

 

         介绍完一些理论知识,说说我在实际应用时,遇到的问题.

         尽管我在使用的时候只使用过selectwhere,我第一次使用的时候,以为select是选择的意思,然后写var obj = objs.select(p=>p.Code='123') ,我以为他会给我找出所有Code123的对象给我,后来发现不是这样的,他给我的是一个一堆123.就是说,假如objs10条数据,Code123的有3,我是想查出这三条数据,但是最后查出10,并且都是123,而且只会返回Code.所以obj其实是string[]类型.obj[0]obj[9]都是123.所以应该用where操作.

        如果把他们写成sql语句的样式,可能我会更容易理解.select code from table1 where p.Code='123'.这条语句只会返回Code一列给我,所以.select(p=>p.Code),只会返回Code一列给我.

       写完这篇博客,对于linqlambda表达式有了一点简单的了解,以后可以多多了解。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics