拉姆達表達式(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)
通過這種技術,我們對於數據和數據表達式的操作可以變得更加輕松,不用動不動就是寫方法了。