2011-02-17 46 views
70

我想takewhile &之間的區別在哪裏LINQ方法。我從MSDN。但得到了以下數據它沒有意義的,我LINQ其中Vs takewhile

Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>) 

過濾值基於序列在一個謂詞上。

TakeWhile<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>) 

只要指定的條件爲真,就返回序列中的元素。

歡迎您提出意見。

回答

121

當條件爲假TakeWhile停止,如果繼續,找到匹配的條件

var intList = new int[] { 1, 2, 3, 4, 5, -1, -2 }; 
Console.WriteLine("Where"); 
foreach (var i in intList.Where(x => x <= 3)) 
    Console.WriteLine(i); 
Console.WriteLine("TakeWhile"); 
foreach (var i in intList.TakeWhile(x => x <= 3)) 
    Console.WriteLine(i); 

所有元素給人

Where 
1 
2 
3 
-1 
-2 
TakeWhile 
1 
2 
3 
24

Where可以檢查整個序列尋找匹配。

Enumerable.Range(1, 10).Where(x => x % 2 == 1) 
// 1, 3, 5, 7, 9 

TakeWhile當遇到第一個不匹配時停止查找。

Enumerable.Range(1, 10).TakeWhile(x => x % 2 == 1) 
// 1 
+0

謝謝。現在對我有意義:) – 2011-02-17 17:39:53

6

假設你有一個包含[1, 3, 5, 7, 9, 0, 2, 4, 6, 8]的數組。現在:

var whereTest = array.Where(i => i <= 5);將返回[1, 3, 5, 0, 2, 4]

var whileTest = array.TakeWhile(i => i <= 5);將返回[1, 3, 5]

+0

我認爲whileTest將只返回1取決於@David B和@Albin Sunnanbo回答 – 2011-02-17 17:42:22

7

MSDN說

Enumerable.TakeWhile Method

返回序列中的元素作爲 只要指定的條件爲真, 然後跳過剩餘的元素。

Enumerable.Where

篩基於 謂詞值的序列。

的區別在於Enumerable.TakeWhile跳過從第一非匹配剩餘元素它們是否匹配的條件或不

4

通過該序列的順序與TakeWhile絕對關鍵的,這將終止爲只要謂詞返回false,而Where將繼續評估超出第一個false值的序列。

TakeWhile的一個常見用法是在大量的,昂貴的甚至是無限的枚舉類型的懶惰評估期間,您可能對序列的排序有額外的知識。

例如鑑於序列:

IEnumerable<BigInteger> InfiniteSequence() 
{ 
    BigInteger sequence = 0; 
    while (true) 
    { 
     yield return sequence++; 
    } 
} 

一個.Where將導致一個無限循環試圖評估枚舉的一部分:

var result = InfiniteSequence() 
    .Where(n => n < 100) 
    .Count(); 

而一個.TakeWhile,並與該可枚舉正在提升知識的武裝,將允許評估部分序列:

var result = InfiniteSequence() 
    .TakeWhile(n => n < 100) 
    .Count(); 
5

雖然現有答案是正確的,但他們都沒有指出爲什麼如果結果是相同的,你會想要使用TakeWhile:性能。假設你有一個有20億個物品的有序列表,並且你想要那些(可能10或15個物品)小於給定值的物品。 Where子句將檢查所有20億個項目,而TakeWhile將在其發現的值等於或大於您提供的值時立即停止