匿名方法、lambda

1、匿名方法
委託做爲函數指針要指向一個方法,相似前面那種寫法,定義函數簽名、按照簽名編寫方法、最後委託指向這個方法,但不少時候沒有必要這麼繁瑣,由於這個方法只有這個Delegate會用,並且每每只會用一次,這時使用匿名方法最合適。相似javascript中函數的寫法:
Func<int, string, bool> d4 = delegate (int i, string str) {
  Console.WriteLine(i + "+" + str);
  return false;
};
var r1 = d4(4, "4");
Console.WriteLine(r1);
2、lambda
lambda表達式屬於函數式編程的形式,在EF等場合會常常使用,labmda常常用的「=>」符號讀做goes to。
基於匿名方法一步步簡化可推導出lambda的寫法:
//1 匿名方法
Func<int, int> f1 = delegate (int i) { Console.WriteLine(i); return 0; };
f1(1);
//2 省略delegate
Func<int, int> f2 = (int i) => { Console.WriteLine(i); return 0; };
f2(2);
//3 省略參數類型
Func<int, int> f3 = (i) => { Console.WriteLine(i); return 0; };
f3(3);
//4 若是是單個參數,省略小括號
Func<int, int> f4 = i => { Console.WriteLine(i); return 0; };
f4(4);
//5 若是隻有一行代碼,省略 大括號  
Func<int, int> f5_1 = i => { return i + 1; };
Func<int, int> f5_2 = i => i + 1;

3、自定義集合擴展方法
自定義集合擴展方法MyWhere以下,擴展方法必須位於靜態類中:
static class MyWhereExt {
  public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> data, Func<T, bool> func) {
    List<T> result = new List<T>();
    foreach (T item in data) {
      if (func(item)) {
        result.Add(item);
      }
    }
    return result;
  }
}
MyWhere對IEnumberable類型進行了擴展,List、數組等實現了這個接口的數據類型就均可以使用MyWhere了,篩選規則經過委託func傳入,能夠對各類集合進行自定義篩選,好比int數組:
int[] nums = new int[] { 3, 5, 7, 8 };
IEnumerable<int> r1 = nums.MyWhere<int>(i => i < 7);
foreach (var item in r1) {
  Console.WriteLine(item);
}
學習自定義MyWhere,是爲了對後續的.net自帶集合擴展方法有初步瞭解。

學習資料:如鵬網.net提升班http://www.rupeng.com/News/10/4603.shtml
javascript

相關文章
相關標籤/搜索