拉姆達表達式(lambda expression)
可以算是一種匿名方法的實現吧。
在c# 2.0中引入了匿名方法的概念,我們可以寫下如下代碼:
1class program
2{
3static void testlambdaexpression()
4{
5 list<int> list = new list<int>();
6
7 list.add(1);
8 list.add(2);
9 list.add(3);
10 list.add(4);
11
12 list<int> evennumbers = list.findall(delegate(int i) { return (i % 2) == 0; } );
13
14 foreach (int evennumber in evennumbers)
15 {
16 console.writeline(evennumber);
17 }
18}
19}
20
21static void main(string[] args)
22{
23testlambdaexpression();
24}
25
匿名方法避免了一些“極小函數”的出現,適當使用可以提高代碼的可閱讀性,顯得清爽一點。
(list的findall方法需要一個delegate參數,所以我們可以這樣謝哈)
在c# 3.0中,我們可以這樣寫:
1static void testlambdaexpression()
2{
3var list = new list<int>();
4
5 list.add(1);
6 list.add(2);
7 list.add(3);
8 list.add(4);
9
10var evennumbers = list.findall(i => (i % 2) == 0);
11
12foreach (int evennumber in evennumbers)
13{
14 console.writeline(evennumber);
15 }
16}
其中i=>(i%2)==0就是我們說的lambda expression,在這里它就起到了原來匿名方法的作用,同時提升了代碼的可閱讀性。
下面是一個復雜一點的lambda expression的例子:
1fruit.filterby((string name, double price) => name == "banana" && price < 2.00);
看了這個例子應該可以自己動手寫一些東西了吧(下樓買瓶可樂去也)
這里還有一個有趣的東西:lambda expression tree(拉姆達表達式樹)
這是一種用來在運行時把表達式作為數據的技術,我們可在運行時靈活的控制和改變表達式,
增強程序的靈活性!
還是看代碼吧,這樣直接一點:
1using system.expressions;
2
3static void main(string[] args)
4{
5 expression<func<int, bool>> filter = n => (n * 3) < 5;
6
7 binaryexpression lt = (binaryexpression) filter.body;
8 binaryexpression mult = (binaryexpression) lt.left;
9 parameterexpression en = (parameterexpression) mult.left;
10 constantexpression three = (constantexpression) mult.right;
11 constantexpression five = (constantexpression) lt.right;
12
13 console.writeline("({0} ({1} {2} {3}) {4})", lt.nodetype,
14 mult.nodetype, en.name, three.value, five.value);
15}
輸出:
(lt (multiply n 3) 5)
通過這種技術,我們對于數據和數據表達式的操作可以變得更加輕松,不用動不動就是寫方法了。
新聞熱點
疑難解答