2016-08-17 48 views
-1

我正在嘗試學習LINQ,並從MSD文檔中發現SkipWhile只要語句正確就會跳過該值。但是當我在下面使用這個聲明時,我沒有按預期得到結果。跳過LINQ中的內容不能正常工作

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; 
var allButFirst3Numbers = numbers.SkipWhile(x => x > 9); 

foreach (var n in allButFirst3Numbers) 
{ 
    Console.WriteLine(n); 
} 

從結果上面的代碼應該是

1,2,3,4,5,6,7,8,9

但我得到的結果作爲

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

任何人都可以指出我在做什麼錯誤,以及如何得到預期的結果。

回答

3

從文檔爲Enumerable.SkipWhile(重點煤礦):

該方法通過使用謂詞測試源的每個元件並跳過元件如果結果是正確的。 在謂詞函數對元素返回false之後,該元素和源中的其餘元素將被放棄,並且不再有謂詞的調用。

因此,因爲第一個元素產生一個false它將返回一切。我懷疑你真的想寫是:

var result = numbers.Where(x => x <= 9); 
+0

感謝你的幫助,我現在明白了。 :) –

+0

@LijinJohn看着你的歷史,你應該學習投票和/或接受幫助你的答案。 – DavidG

1

你正在得到你應該得到的。當x> 9時,你說跳過。1小於9,所以它馬上開始服用。

嘗試.SkipWhile(x=>x<=9) ...但是,這將使你10,11,12,13,...

你也可以嘗試.TakeWhile(x=>x<=9)將返回1,2,3,4,5,6,7 ,8,9-

0

上述謂詞x => x > 9將匹配列表中的啓動和一旦謂語是false它會繼續,並考慮所有的元素。你還是嘗試使用Where()擴展方法像

var allButFirst3Numbers = numbers.Where(x => x > 9); 
0

然後你想利用,不能跳過

var numbers = Enumerable.Range(1, 15); 
var result = numbers.TakeWhile(x => x <= 9); 
Debug.Print(string.Join(", ", result)); // 1, 2, 3, 4, 5, 6, 7, 8, 9