国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Linq之Expression高級篇(常用表達式類型)

2019-11-17 02:35:33
字體:
來源:轉載
供稿:網友

Linq之ExPRession高級篇(常用表達式類型)

目錄

寫在前面

系列文章

變量表達式

常量表達式

條件表達式

賦值表達式

二元運算符表達式

一元運算符表達式

循環表達式

塊表達式

總結

寫在前面

首先回顧一下上篇文章的內容,上篇文章介紹了表達式樹的解析和編譯。如果忘記了,可以通過下面系列文章提供的入口進行復習。這篇文章將介紹常見的表達式類型。

常見的表達式類型都有個共同的基類Expression。創建這些類型的對象,是通過API的方式創建的(也就是Expression的靜態方法),首先引入命名空間:

1 using System.Linq.Expressions;

系列文章

Linq之Lambda表達式初步認識

Linq之Lambda進階

Linq之隱式類型、自動屬性、初始化器、匿名類

Linq之擴展方法

Linq之Expression初見

Linq之Expression進階

變量表達式

在表達式樹中使用ParameterExpression或者ParameterExpression表達式表示變量類型,下面看一個例子,我們定義一個int類型的變量i:

  // ParameterExpression表示命名的參數表達式。ParameterExpression i = Expression.Parameter(typeof(int),"i");

或者使用

1 ParameterExpression j = Expression.Variable(typeof(int), "j");

通過f12轉到定義,發現這兩個方法的注釋幾乎是一樣的。靜態方法Parameter第一個參數:定義的參數類型,第二個參數:為參數名稱。

常量表達式

在表達式樹中使用ConstantExpression表達式表示具有常量值的表達式。,看一個例子,我們定義一個int類型的常量5.并將該值賦值給上面定義的變量i

1             // ParameterExpression表示命名的參數表達式。2             ParameterExpression i = Expression.Parameter(typeof(int), "i");3             //ParameterExpression j = Expression.Variable(typeof(int), "j");4             ConstantExpression constExpr = Expression.Constant(5, typeof(int));5             // 創建一個表示賦值運算的 System.Linq.Expressions.BinaryExpression6             //表示包含二元運算符的表達式。7             BinaryExpression binaryExpression = Expression.Assign(i, constExpr);

Constrant方法第一個參數:常量,第二個參數為什么類型的常量。

這里提到了BinaryExpression表達式,該表達式標識包含二元運算符的表達式,類似與=,>這樣的二元表達式都可以使用BinaryExpression表達式來表示。

調試模式下,在自動窗口查看當前表達式的DebugView屬性,這個屬性在調試表達式樹的時候是非常有用的:

變量:

常量:

二元表達式:

通過觀察上面的圖,可知變量調試模式下DebugView屬性將顯示前面帶有“$”符號的 ParameterExpression 變量名稱。那么如果參數沒有名稱,則會為其分配一個自動生成的名稱,例如 $var1 或 $var2(這里不再舉例)。

條件表達式

在很多時候,我們都需要使用條件表達式來過濾一些數據,然后返回滿足條件的數據,在表達式中有這樣一些表達式滿足你的需求。

常見運算符

>,>=

<,<=

if....then:如果滿足條件那么..

if...then...else:如果滿足條件執行某某代碼,否則執行另外的邏輯

一個例子

IfThenElse方法

1 public static ConditionalExpression IfThenElse(2     Expression test,3     Expression ifTrue,4     Expression ifFalse5 )
 1             bool test = true; 2             ConditionalExpression codition = Expression.IfThenElse( 3                 //條件 4                 Expression.Constant(test), 5                 //如果條件為true,調用WriteLine方法輸出“條件為true” 6                  Expression.Call( 7                  null, 8                  typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), 9                  Expression.Constant("條件為true")10                  ),11                 //如果條件false12                   Expression.Call(13                  null,14                  typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }),15                  Expression.Constant("條件為false")16                  )17                  );18             //編譯表達式樹,輸出結果19             Expression.Lambda<Action>(codition).Compile()();

輸出結果

例子描述:條件test包裝為常量表達式,因為test為true,所以執行iftrue的表達式,并調用WriteLine方法打印出信息。

賦值表達式

=

還以上面為變量i賦值的例子為例

1             ParameterExpression i = Expression.Parameter(typeof(int), "i");2             //ParameterExpression j = Expression.Variable(typeof(int), "j");3             ConstantExpression constExpr = Expression.Constant(5, typeof(int));4             // 創建一個表示賦值運算的 System.Linq.Expressions.BinaryExpression5             //表示包含二元運算符的表達式。6             BinaryExpression binaryExpression = Expression.Assign(i, constExpr);

+=

1 BinaryExpression b2 = Expression.AddAssign(i, constExpr);

-=

1 BinaryExpression b3 = Expression.SubtractAssign(i, constExpr);

*=

 BinaryExpression b4 = Expression.MultiplyAssign(i, constExpr);

/=

1 BinaryExpression b5= Expression.DivideAssign(i, constExpr);

舉一個例子

 1  ParameterExpression i = Expression.Parameter(typeof(int), "i"); 2             BlockExpression block = Expression.Block( 3                 new[] { i }, 4                 //賦初值 i=5 5                 Expression.Assign(i, Expression.Constant(5, typeof(int))), 6                 //i+=5 10 7                 Expression.AddAssign(i, Expression.Constant(5, typeof(int))), 8                 //i-=5 5 9                 Expression.SubtractAssign(i, Expression.Constant(5, typeof(int))),10                 //i*=5 2511                Expression.MultiplyAssign(i, Expression.Constant(5, typeof(int))),12                 //i/=5 513                Expression.DivideAssign(i, Expression.Constant(5, typeof(int)))14                );15             Console.WriteLine(Expression.Lambda<Func<int>>(block).Compile()());

結果

二元運算符表達式

在上面也提到了部分二元運算符表達式,類似加減乘除這樣的運算符,對于二元運算符,就不再舉例。這些返回的表達式樹,都可以使用BinaryExpression來接收,或者使用基類Expression接收,或者更省事,使用var關鍵字。

一元運算符表達式

類似++,--運算符

i++等價于i=i+1,運算順序就是i先加1,然后再賦值給i。在表達式書中使用Expression的PostIncrementAssign方法來進行自增或者自減操作。返回結果為UnaryExpression類型,同樣可以使用基類Expression接收,或者var。

循環表達式

在表達式樹中使用Expression的Loop方法實現循環。

塊表達式

在前面的文章中,也說了不能使用Lambda方式創建帶塊級的表達式樹,不然會有如下的錯誤

通過API的方式可以創建塊級表達式樹,其中Expression的Block方法功不可沒。例如上面的加減乘除的例子中,可以包括多個Expression。

那么,下面就舉一個包含自增的一元表達式,循環的表達式塊,并輸出結果。

輸出1-100之間的所有偶數。

 1     class Program 2     { 3         static void Main(string[] args) 4         { 5
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 苗栗县| 龙山县| 金寨县| 贵德县| 长沙县| 江油市| 巴彦淖尔市| 南昌市| 上饶县| 拉萨市| 岱山县| 江源县| 平泉县| 泾川县| 湘潭县| 福清市| 玉龙| 河池市| 英德市| 陇南市| 延津县| 太保市| 红安县| 海城市| 田东县| 麻江县| 右玉县| 蓝山县| 谷城县| 灌云县| 柯坪县| 子洲县| 交口县| 邳州市| 正阳县| 抚州市| 焉耆| 昔阳县| 平顶山市| 岱山县| 漯河市|