Linq 語法結構
(來自Linq in action)
舉個例子實現:
查詢以a開頭的字符串,按降序輸出。
C#代碼:
string[] list = { "adobe", "Excel", "acer", "query", "async", "xianfen", "apple", "amazon", "player", "best", "wow" };
var result = from Word in list
where Word.StartsWith("a")
orderby Word descending
select Word;
result.ToList().ForEach(str => Console.WriteLine(str));
// 輸出:
// async
// apple
// amazon
// adobe
// acer
等價的面向對象語法為:
var result = list.Where(str => str.StartsWith("a"))
.OrderByDescending(str => { return str; });
這裡 Where 和 OrderByDescending都是IEnumerable<T>的擴展方法,因為數組類型實現了該接口,所以可以直接調用這些這些擴展方法。
這些擴展方法的實現是在Enumerable類型中實現的,因此,更直接的是調用Enumerable類型的靜態方法方法:
var result =
Enumerable.OrderByDescending(
Enumerable.Where(
list, str => str.StartsWith("a")), str => { return str; }
);
從這些逆向演化可以看出,查詢語法就是一種"語法糖"。前面提到過,編譯後運行時版本還是2.0,從這可以看出一些端倪。如果想繼續深入了解該實現可以用ILDASM查看IL源代碼和反射類庫源代碼。
result類型為IEnumerable<TElement>或派生自IEnumerable<TElement>接口的類型。