成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linq Lambda表達式全面分析

開發 后端
這里介紹對待Linq Lambda表達式,最基本一個原則是不要把表達式看成了語句的運算結果,而應該看成這些語句本身,也就是把語句作為對象來處理。

在向大家詳細介紹Linq Lambda表達式之前,首先讓大家了解下expr是什么樣的東西,然后全面介紹Linq Lambda表達式。

介紹Linq Lambda表達式之前,先看一個例子:

  1. Expression<Func<string, bool>> expr = o => o.Length > 10; 

初次接觸Linq Lambda表達式的人可能會被搞迷糊,這樣的語句到底是什么意思,怎么樣工作,原理又是什么。

逐級分析以上語句,分為兩個部分,以等號為界。

第一部分是變量類型的申明:Expression<Func<string, bool>> expr,表示expr這個變量是一個Linq Lambda表達式,這個表達式符合這樣的一種委托:bool DelegateName(string obj)。

第二部分是表達式的聲明o => o.Length > 10,這個“=>”是Lambda操作符,讀作“轉到”,必須把=>左右看成是一個整體,因為這實際是一個匿名方法,“=>”左邊是方法傳入參數的申明,右邊是函數體,如果用常規的表示方法,可以寫成如下形式:

  1. bool MethodName(string o)  
  2. {  
  3. return o.Length > 10;  

仔細觀察兩部分拆解以后的形式其實不難發現,第一部分的工作是定義了一個匿名的委托,而第二部分則是符合這個匿名委托的一個方法,由于這個方法沒有明確給定名稱,因此稱為匿名方法。

那么,expr到底又是什么樣的東西。有一點必須明確的是,expr表示絕對不是這個匿名方法的返回值,而是這個匿名方法中所有表達式的System.Linq.Expressions.Expression形式。也就是說,在expr中,這個函數體里所有的表達式已經被拆解成一個一個的單元,每一個單元都是一種System.Linq.Expressions.Expression的派生類。由于表達式和表達式之前存在著上下級的關系,因此所有的表達式呈現一種樹狀結構,稱為表達式樹。

一個匿名方法是如何轉換為表達式樹的呢?這個問題其實不用太過關心,因為C#編譯器在對程序編譯的時候已經將上述第二部分的內容自動轉換為相應的表達式樹了。上述例子中編譯的結果通過Reflector反編譯出來的內容如下所示:

  1. 1. ParameterExpression CS$0$0000;  
  2. 2. Expression<Func<string, bool>> expr = Expression.Lambda<Func<string
    bool
    >>(Expression.GreaterThan(Expression.Property(CS$0$0000 = Expression.
    Parameter(typeof(string), "o"), (MethodInfo) methodof(string.get_Length)), 
    Expression.Constant(10, typeof(int))), new ParameterExpression[] { CS$0$0000 });  

這串代碼看起來有點糊,我把代碼梳理了一下使得它更容易讀,如下所示:

  1. Expression<Func<string, bool>> expr;  
  2.  
  3. // 創建表示參數的表達式。  
  4. ParameterExpression paramExpr = Expression.Parameter(typeof(string), "o");  
  5. // 獲取表示System.String.Length屬性的System.Reflection.PropertyInfo對象。  
  6. PropertyInfo propInfo = typeof(string).GetProperty
    ("Length", BindingFlags.Instance | BindingFlags.Public);  
  7. // 創建訪問System.String.Length屬性的表達式。  
  8. MemberExpression memberExpr = Expression.Property(paramExpr, propInfo);  
  9. // 創建一個表示常量10的表達式。  
  10. ConstantExpression constExpr = Expression.Constant(10, typeof(int));  
  11. // 創建表示左邊大于右邊的二分表達式。  
  12. BinaryExpression greaterThanExpr = Expression.GreaterThan(memberExpr, constExpr);  
  13. // 通過上述二分表達式創建一個Lambda表達式。  
  14. expr = Expression.Lambda<Func<string, bool>>(greaterThanExpr, paramExpr); 

是不是好麻煩啊?呵呵,好在這些工作已經在編譯的時候完成了,不需要我們手工創建,除非你想動態創建表達式。關于如何動態創建表達式,我在這里就先不詳細說明了,將在下一博里再詳述。

綜上所述,對待Linq Lambda表達式,最基本一個原則是不要把表達式看成了語句的運算結果,而應該看成這些語句本身,也就是把語句作為對象來處理。語句和語句之間通過表達式樹來關聯,而從語句轉換為表達式樹已由編譯器自動完成,不需要人工介入。

【編輯推薦】

  1. Linq查詢二維數組淺析
  2. 學習Linq經驗總結
  3. Linq修改XML文檔描述
  4. Linq延時執行全面分析
  5. Linq實現Left join
責任編輯:佚名 來源: IT168
相關推薦

2009-09-11 09:48:27

Linq Lambda

2009-09-09 13:01:33

LINQ Lambda

2009-09-15 15:18:00

Linq Lambda

2009-09-15 17:30:00

Linq Lambda

2009-09-17 10:40:22

Linq Lambda

2009-09-17 09:09:50

Lambda表達式Linq查詢

2009-09-09 17:14:17

Linq lambda

2009-09-09 17:45:07

Linq表達式

2009-09-17 14:21:19

LINQ表達式

2009-09-11 12:32:33

LINQ表達式

2011-10-28 16:34:13

LINQ

2009-09-10 15:35:07

LINQ查詢表達式

2009-09-17 11:08:55

LINQ查詢表達式

2022-12-05 09:31:51

接口lambda表達式

2010-03-03 12:53:50

Linux正則表達式

2010-03-03 12:58:41

Linux正則表達式

2010-03-03 13:09:10

Linux正則表達式

2010-03-03 11:03:51

Linux正則表達式

2010-03-03 13:31:25

Linux正則表達式

2010-03-03 10:51:32

正則表達式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 毛片av免费在线观看 | 日韩精品一区二区三区在线播放 | 色悠悠久 | 性高朝久久久久久久3小时 av一区二区三区四区 | 国产亚洲欧美另类一区二区三区 | 国产乱码精品一区二区三区忘忧草 | 亚洲成a人片 | 久久夜夜 | 日韩av一二三区 | 免费视频久久 | 国产精品久久久久久久久久久新郎 | 97视频久久| 日日拍夜夜 | 色嗨嗨 | 国产一区二区三区在线看 | caoporn地址| 亚洲国产精品久久久久秋霞不卡 | 国产乱码精品一区二区三区忘忧草 | 久久国产精品免费一区二区三区 | 国产乱码精品1区2区3区 | 伊人av在线播放 | 欧美在线一区二区三区 | 97免费在线观看视频 | 国产精品视频一 | 伊大人久久 | 免费在线观看一区二区三区 | 日韩在线不卡视频 | 日韩欧美高清dvd碟片 | 国产做a爱免费视频 | 亚洲福利一区 | 久久久久久久久久久久久9999 | 日本欧美在线观看视频 | 成人免费网视频 | 色桃网| 自拍亚洲 | 欧美国产视频 | 欧美在线高清 | 成人午夜精品 | 亚洲一区二区三区免费观看 | 秋霞国产 | 在线看免费的a |