在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表示式還是為我們編碼提供了更簡便、更直觀的方式,還是挺不錯的。