Tuesday, January 13, 2009

Enumerable.Where 方法 (C# 3)

我講錯的話,歡迎公幹我!高中同學們下面這些對你們來講太深奧了,賣來鬧!

因為微軟常弄一些新語法,沒人叫你使用,只是為了要複製、貼上,

所以總要看的懂吧!

//我有一堆水果:蘋果、香蕉、芒果、橘子………

List<string> fruits = new List<string>

{ "apple",  "banana", "mango", "orange", "blueberry",  "strawberry" };

//我要找出名字長度小於6的水果

IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);

//一個一個列出來給我看。

foreach (string fruit in query)

{ Console.WriteLine(fruit); }

/* 所以結果是: apple mango */

fruits.Where(fruit => fruit.Length < 6)

我要講的是 Where ,看一下下面的方法定義

public static IEnumerable<TSource> Where<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate )

  • Where 是擴充方法 (在既有型別上擴充新的方法,不去實作衍生型別)

而且只有實作IEnumerable<TSource>的型別才可使用,

而frults是 List<T> (public class List<T> : IEnumerable<T>..)。

  • Func<TSource, bool> predicate

是說predisate 你就代表一種方法

這種方法需要一個TSource型別的參數(ex int,string,double…)

而這方法回傳回bool(是,否)。

所以勒為什麼這邊Where裡要寫fruit => fruit.Length < 6

fruit => fruit.Length < 6   Lamba 運算式

(暫時不講Lamba 因為又很長)

這樣看吧!改寫

System.Linq.Expressions.Expression<Func<string, bool>> expr

= fruit => fruit.Length < 6; (有更麻煩的寫法)

Func<string, bool> deleg2 = expr.Compile();

IEnumerable<string> query = fruits.Where(deleg2);

這樣寫有比較清楚為什麼Where(fruit => fruit.Length < 6)

----------------------------------------------------------

這次改成Linq

IEnumerable<string> query = from fruit in fruits
                            where fruit.Length < 6
                            select fruit;

其實編譯器還是會依照規則改成上面 Where的寫法。

看的霧煞煞的話,那我就去睡了,再見!

No comments:

Post a Comment