usingsystem;
using
system.collections.generic;
using
system.diagnostics;
using
system.linq;
using
system.linq.expressions;
using
system.reflection;
using
system.text;
using
system.threading.tasks;
namespace
表示式樹
blockexpression blockexp =expression.block
(expression.call
(null
,
typeof(console).getmethod("
write
", new ),
expression.constant(
"hello world")
),expression.constant(42)
);expression
int>> lambdblock = expression.lambdaint>>(blockexp);
console.writeline(lambdblock.compile()());
//4.通過 expression 類建立表示式樹
//lambda:num => num == 0
parameterexpression pexpression = expression.parameter(typeof(int),"
num"); //
引數:num
constantexpression cexpression = expression.constant(0); //
常量:0
//binaryexpression bexpression = expression.makebinary(expressiontype.equal, pexpression, cexpression);
//表示式:num == 0
binaryexpression bexpression=expression.equal(pexpression, cexpression);
expression
int, bool>> lambda = expression.lambdaint, bool>>(bexpression, pexpression); //
lambda 表示式:num => num == 0
console.writeline(lambda.compile()(12
));
//5.表示式與反射應用
//請用表示式實現乙個動態邏輯,可以更新任意一種資料實體類的集合,比如list中每乙個元素的指定屬性;
book b1 = new book() ;
list
list_book = new list();
for (int i = 0; i < 1000000; i++)
var sw = new
stopwatch();
sw.start();
////表示式優化
setallproperty_expstring>(list_book, "
author
", "
123"
); sw.stop();
console.writeline(
"表示式優化耗時:
" +sw.elapsedmilliseconds);
sw.restart();
////反射
setallproperty(list_book, "
author
", "
458"
); sw.stop();
console.writeline(
"反射耗時:
" +sw.elapsedmilliseconds);
//6. 思考題a. xy+x+y
//法一
expressionint, int, int>> lambdex = (x, y) => x * y + x +y;
console.writeline(
"表示式:
" + lambdex + "
,值:" + lambdex.compile()(1, 2
));
////法二
var xexp = expression.parameter(typeof(int), "x"
);
var yexp = expression.parameter(typeof(int), "y"
);
var xyexp =expression.multiply(xexp, yexp);
var xplusyexp =expression.add(xexp, yexp);
var exp =expression.add(xyexp, xplusyexp);
expression
int, int, int>> lambdexp1 = expression.lambdaint, int, int>>(exp, new
); func
del =lambdexp1.compile();
console.writeline(
"表示式:
" + lambdexp1 + "
,值:" + del(1, 2
));
//思考題b. console.writeline("hi")
//法一
expressionstring>> lambdexp2 = (h) =>console.writeline(h);
lambdexp2.compile()("hi
");console.writeline(lambdexp2);
//法二
var parameterexp = expression.parameter(typeof(string), "h"
);
var methodinfo = typeof(console).getmethod("
writeline
", new );
var bodyexp = expression.call(null
, methodinfo, parameterexp);
var lambdexp = expression.lambdastring>>(bodyexp, parameterexp);
lambdexp.compile()(
"h12");
console.readkey();
}class
book
public
string name
}static
void setallproperty(listlist, string propertyname, object
propertyvalue)
}static
void setallproperty_exp(listlist,string
propertyname,k propertyvalue)}}
}
字尾表示式 2 表達樹與字尾表示式的運算
這裡,我們依然假設運算子都是二元的,這樣構造出來的表達樹必然是乙個二叉樹。對於乙個給定的字尾表示式,它表達樹的根節點是該表示式最外層的運算子。根節點的左右子樹分別為該運算子的第乙個和第二個運算元。這兩個運算元可能是樹,也可能是字尾子式對應的表達樹。例.對於如下字尾式 ab 其對應的表達樹為 a b例...
C 3 0 Lamdba表示式與表示式樹
c 2.0中的匿名方法使得建立委託變得簡單起來,甚至想不到還有什麼方式可以更加的簡化,而c 3.0中的lamdba則給了我們答案。lamdba的行為實際上和匿名方法是一致的,可以簡單粗暴的理解為是匿名方法的進化版本,和匿名方法作用一致,但書寫起來更加簡單,lamdba表示式有特別的轉換規則,表示式並...
表示式樹的建立與輸出
表示式樹的建立與輸出 編乙個程式,讀入先序遍歷字串,根據此字串建立一棵二叉樹 以指標方式儲存 請注意的是,我們保證該樹一定是表示式樹 見教材5.2 5.8 例如下面的先序遍歷字串 建立起此二叉樹以後,再按要求輸出二叉樹。輸入輸入由多組測試資料組成。每組資料報含一行字串,即表示式樹的先序遍歷序列,字串...