在C#2.0之前就有委託了,在2.0之後又引入了匿名方法,C#3.0之後,又引入了Lambda表示式,他們三者之間的順序是:委託->匿名錶達式->Lambda表示式,微軟的一步步升級,帶給我們程式設計上的優美,簡潔,可讀性強.....其實是說到底Lambda表示式也是匿名方法的一種,下面咋們就簡單聊聊這幾者之間的微妙關係。

宣告一個委託:

delegate int calculator(int num1, int num2);

下面分別採用委託方式、匿名方法方式以及lambda表示式來實現下:

(1)

calculator new_calculator = new calculator(NumAdd); //委託

private int NumAdd(int num1, int num2)

{
return num1 + num2;
}

int nums = new_calculator(10, 1);

(2)

calculator new_calculator2 = delegate(int a, int b) { return a + b; }; //匿名
int nums2 = new_calculator2(10, 1);

(3)

calculator new_calculator3 = (x, y) => x + y;//lambda表示式
int nums3 = new_calculator3(10, 1);

string strMsg = string.Format("nums={0},nums2={1},nums3={2}", nums, nums2, nums3);

很明顯三種方式結果是一直都是11,但是有沒有發現我們的程式碼在越來越精簡,越來越顯得有逼格,O(∩_∩)O哈哈~

這其實就是簡單的例子來介紹下,這三者的關係,其實我們平時用的比較多的是Lambda表示式操作資料集合物件,下面舉個小例子看看:

List<Person> listPerson = new List<Person>();
listPerson.Add(new Person { Name = "Alice", Address = "北京", Age = 30 });
listPerson.Add(new Person { Name = "Joe", Address = "上海", Age = 34 });
listPerson.Add(new Person { Name = "Cat", Address = "廣州", Age = 24 });
listPerson.Add(new Person { Name = "Alan", Address = "深圳", Age = 26 });
listPerson.Add(new Person { Name = "Tom", Address = "重慶", Age = 28 });
listPerson.Add(new Person { Name = "Jarrey", Address = "天津", Age = 40 });

(Person就是個實體物件,在此就不貼宣告實體物件的程式碼了)

現在咋們有了一個Person物件集合了,比如我們想用Lambda表示式處理下,得到Age小於30的Person:

//委託方式和Lambda表示式對比

(1)

IEnumerable<Person> result = listPerson.Where(delegate(Person p) { return p.Age < 30; });//委託方式

(2)

IEnumerable<Person> result = listPerson.Where  (p => p.Age < 30); //Lambda表示式

如果我們用遍歷的方式是不是也可以得到我們想要的物件集合?答案是: 當然可以

(3)

List<Person> listPersonNew = new List<Person>();
foreach (var item in listPerson)
{
if (item.Age <30)
{
listPersonNew.Add(item);
}
}

這是比較傳統的方式,我麼也可以直接用Lambda表示式遍歷集合,捨棄傳統的遍歷方式:

(4)

List<Person> listPersonNew = new List<Person>();
listPerson.ForEach(p => {
if (p.Age <30)
{
listPersonNew.Add(p);
}

});

遍歷以上四個結果會發現,結果一致,都包含了Cat、Alan、Tom三個人。

以上四種方式,如果是你,你會用哪種方式?方式一和方式二你更傾向哪種?方式三和方式四你又更傾向哪種?

其實總得來看,Lambda表示式還是為我們編碼提供了更簡便、更直觀的方式,還是挺不錯的。