首先我們看乙個簡單 lambda 表示式的構成。
i => i > 5
在這個表示式中,"i" 被稱為 parameter,"i > 5" 是 body。我們可以對 body 進行更進一步的分解,那麼 "i > 5" 分別包含引數(i)、操作符(>)以及乙個常數(5)。所有這些通過特定順序的組合,從而構建乙個完整的 lambda 表示式。
我們通過一些例子,來學習如何動態構建這些表示式。
例子1
var ints = newint ;
//var r = ints.where(i => i > 5);
//要實現的表示式
//建立引數 i
var parameter = expression.parameter(typeof(int), "i"
);//
建立常量5
var constant = expression.constant(5
);//
建立比較表示式 i > 5
var bin =expression.greaterthan(parameter, constant);
//獲取lambda表示式
var lambda = expression.lambdaint, bool>>(bin, parameter);
//通過 compile 方法獲取 delegate
var _r = ints.where(lambda.compile());
例子2
var ints = newint ;
//var r = ints.where(i => i > 5 && i <= 7);
//要實現的表示式
//建立引數 i
var parameter = expression.parameter(typeof(int), "i"
);//
建立表示式 i > 5
var con1 = expression.constant(5
);var bin1 =expression.greaterthan(parameter, con1);
//建立表示式 i <= 7
var con2 = expression.constant(7
);var bin2 =expression.lessthanorequal(parameter, con2);
//組合兩個表示式
var body =expression.and(bin1, bin2);
//獲取 lambda 表示式
var lambda = expression.lambdaint, bool>>(body, parameter);
var _r = ints.where(lambda.compile());
在例子2中,我們對複雜的表示式進行了分解,並使用 and 完成多個表示式的組裝,由此我們可以建立更加複雜的邏輯組合,比如例子3。
例子3
var ints = newint ;
//var r = ints.where(i => (i > 5 && i <= 7) || (i == 3));
//要實現的表示式
//建立引數 i
var parameter = expression.parameter(typeof(int), "i"
);//
建立表示式 i > 5
var con1 = expression.constant(5
);var bin1 =expression.greaterthan(parameter, con1);
//建立表示式 i < 7
var con2 = expression.constant(7
);var bin2 =expression.lessthanorequal(parameter, con2);
//建立表示式 i == 3
var con3 = expression.constant(3
);var bin3 =expression.equal(parameter, con3);
//組合 i > 5 && i <= 7
var body =expression.and(bin1, bin2);
//組合 ( i > 5 && i <= 7) or (i == 3)
body =expression.or(body, bin3);
var lambda = expression.lambdaint, bool>>(body, parameter);
var _r = ints.where(lambda.compile());
例子4
var ints = newint ;
//var r = ints.select(i => i % 2 == 0 ? i : 0);
//要實現的表示式
//建立引數 i
var parameter = expression.parameter(typeof(int), "i"
);//
建立表示式 i % 2
var con1 = expression.constant(2
);var bin1 =expression.modulo(parameter, con1);
//建立表示式 (i % 2) == 0
var con2 = expression.constant(0
);var bin2 =expression.equal(bin1, con2);
//建立表示式 iif(((i % 2) = 0), i, 0)
var bin3 = expression.condition(bin2, parameter, expression.constant(0
));var lambda = expression.lambdaint, int>>(bin3, parameter);
var _r = ints.select(lambda.compile());
例子5
var ints = newint ;
i => console.writeline(i));
//要實現的表示式
//建立引數i
var parameter = expression.parameter(typeof(int), "i"
);//
獲取 console.writeline methodinfo
methodinfo method = typeof(console).getmethod("
writeline
", new type );
//建立表示式
var call =expression.call(method, parameter);
var lambda = expression.lambdaint>>(call, parameter);
array.foreach
(ints, lambda.compile());
動態建立 Lambda 表示式
作為 delegate 的更深度進化,lambda 讓我們的 顯得更加簡潔和優雅,但同時也面臨乙個問題,就是如何依據外部條件動態構建乙個 lambda 表示式。或許你會奇怪這個需求是如何產生的 首先,lambda 在 dlinq 中承擔了以往 t sql 的部分角色 其次,在資料庫設計中,我們往往需...
lambda表示式 lambda表示式
1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...
Lambda表示式和Lambda表示式樹
原版來自 linq學習筆記之二 lambda表示式和lambda表示式樹 lambda 表示式 lambda expressions 是linq實現的另一特性。lambda表示式的作用就是使用使用函式式語法,將方法實現關聯到委託例項。在使用查詢表示式 query expressions 時,查詢表示...