2013-01-16 105 views
3

如果參數fruit(我知道它是一個輸入參數),如果條件對於謂詞爲真,則我很困惑。如下面的代碼表示:如果Predicate返回true,則返回Lambda表達式

List<string> fruits = new List<string> { 
    "apple", 
    "passionfruit", 
    "banana", 
    "mango", 
    "orange", 
    "blueberry", 
    "grape", 
    "strawberry" 
}; 

IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 8); 
// query contains: {apple,banana,mango,orange,grape} 

IEnumerable<string> query2 = query.Where(fruit => fruits.Contains("apple")); 

foreach (string fruity in query2) 
{ 
    Console.WriteLine(fruity); 
} 

// finally returns: {apple,banana,mango,orange,grape} 

因此,如果條件爲真,則返回輸入。

請指導我,如果我錯了

+0

是,如果謂詞對元素返回true,則該元素將位於由where返回的元素的子集中。它將返回長度小於8的數組中的任何字符串。 –

+0

你期望在第二個查詢中只看到蘋果嗎? – ryadavilli

+0

這只是一個錯字...它應該是IEnumerable query2 = query.Where(fruit => fruit.Contains(「apple」));'我猜 – horgh

回答

4

Where返回該謂詞返回true輸入的過濾序列。它依次應用於每個元素,並且該項目被放棄或丟棄。基本上是:

public static IEnumerable<T>(this IEnumerable<T> source, Func<T,bool> predicate) 
{ 
    foreach(var el in source) { 
     if(predicate(el) { 
      yield return el; 
     } 
    } 
} 

看名字:

IEnumerable<string> query2 = query.Where(fruit => fruits.Contains("apple")); 

,說,對於每一個fruit,看是否整套fruits,注意最後s)返回一個蘋果。清單fruits確實包含apple,所以每個水果都是如此。

您可能意味着:

IEnumerable<string> query2 = query.Where(fruit => fruit.Contains("apple")); 
+0

所以這就是它爲什麼返回水果(輸入參數),因爲條件爲真。現在我們看下面的代碼: – Sadiq

+0

@Sadiq它在每個項目的基礎上應用謂詞;它將從謂詞爲真的輸入序列中產生所有事物的序列。這就是爲什麼第一次測試返回一個序列,產生短名稱的成果。對於所有項目,第二個測試是正確的,因爲謂詞本身甚至不會查看它是哪個項目:它總是全是真或全是假。 –

+0

委託int anonymousDel(int i); anonymousDel myDelegate = new anonymousDel( delegate(int x) { return x * 2; }); 控制檯。WriteLine(「{0}」,myDelegate(5)); anonymousDel myDelegate = x => x * 2;在這種情況下,IT不會返回輸入參數 – Sadiq

1

LINQ當返回IEnumerably設定了謂詞返回true的所有項目。

在你的第二個查詢中,你正在做fruits.Contains("apple"),這基本上總是正確的,或者總是爲false。也許你的意思做以下幾點:

IEnumerable<string> query2 = query.Where(fruit => fruit == "apple"); 
//returns: {apple} 
1

你能想到的。凡拉姆達爲SQL查詢:

SELECT * FROM IEnumerable WHERE Predicate = TRUE; 

對我來說這是最好的方式,由於SQL背景:)