C 利用Lambda表示式樹簡化函式呼叫

2021-06-20 12:39:08 字數 1633 閱讀 6426

沒有使用表示式樹的**:

//公式引數名稱

var parameternamegroup = getgroupsetupparameters(formulaelements, "parameternamegroup");

//公式引數範圍

var parameterrange = getgroupsetupparameters(formulaelements, "parameterrange");

//公式

var image = getgroupsetupparameters(formulaelements, "image");

getgroupsetupparameters返回的是乙個ilist型別, 注意上面不止一次的呼叫了getgroupsetupparameters,但每次都傳入乙個一樣的引數formulaelements

下面使用表示式樹來簡化這個函式呼叫

expression>> ex = name =>  getgroupsetupparameters(formulaelements, name);

var funcgetparameters = ex.compile();

//公式引數名稱

var parameternamegroup = funcgetparameters("parameternamegroup");

//公式引數範圍

var parameterrange = funcgetparameters("parameterrange");

//檢查引數合法性

var validparameter = funcgetparameters("validparameter");

注意看上面的修改,修改之前,需要呼叫的函式(getgroupsetupparameters)每次都是傳兩個引數,

但有乙個引數是一樣的,就是formulaelements!如果只呼叫一次這個函式還好,但是如果多次呼叫,就讓人感到很累贅了,這個時候可以用表示式樹簡化,去掉乙個引數

注意下面兩行**

expression>> ex = name =>  getgroupsetupparameters(formulaelements, name);

var funcgetparameters = ex.compile();

funcgetparameters就是最終編譯(典型的動態程式設計特徵)表示式樹後,形成的該表示式的委託.可以看到,這個表示式樹的構造是乙個**可控的過程(也就是說,可以動態構建)

你甚至可以寫成

expression>> ex = null;

if (***x == true)

ex = name => somemethod1(formulaelements, name);

else

ex = name => somemethod2(formulaelements, name);

這樣就是依據條件來生成乙個內部實現不同的委託,是不是很神奇?

Lambda表示式和Lambda表示式樹

原版來自 linq學習筆記之二 lambda表示式和lambda表示式樹 lambda 表示式 lambda expressions 是linq實現的另一特性。lambda表示式的作用就是使用使用函式式語法,將方法實現關聯到委託例項。在使用查詢表示式 query expressions 時,查詢表示...

Lambda表示式表示式樹

在c 3.0中,繼匿名方法之後出現了lambda 表示式,使表達更為簡潔 快捷。lambda 表示式使用lambda 運算子 來定義,語法如下 引數列表 lambda 運算子的左邊是輸入引數,定義lambda表示式的接收引數列表,右邊包含表示式或語句塊,表示將表示式的值或語句塊返回的值傳給左邊的引數...

Lambda表示式樹

表示式的引數 parameterexpression a expression.parameter typeof int a parameterexpression b expression.parameter typeof int b 表示式的主體部分 binaryexpression be ex...