2010-03-26 48 views
25

我有點驚訝地發現下面的代碼,在這裏我只是想從整數序列中刪除所有3S的結果:LINQ - 是SkipWhile破?

var sequence = new [] { 1, 1, 2, 3 }; 
var result = sequence.SkipWhile(i => i == 3); // Oh noes! Returns { 1, 1, 2, 3 } 

爲什麼不跳過3?

我的下一個想法是,確定,除了運營商將這樣的伎倆:

var sequence = new [] { 1, 1, 2, 3 }; 
var result = sequence.Except(i => i == 3); // Oh noes! Returns { 1, 2 } 

綜上所述,

  • 除了刪除3,但也 剔除沒有不同的元素。格兒。
  • SkipWhile不會跳過最後一個 元素,即使它與 條件匹配。格兒。

有人可以解釋爲什麼SkipWhile不會跳過最後一個元素嗎?任何人都可以建議什麼LINQ運算符我可以用來從上面的序列中刪除'3'?

+0

認爲它是SkipWhile(true)。所以,你的第一個條件(i == 3)失敗。所以,它變成了SkipWhile(false),接下來會發生什麼?它會返回剩餘的每個元素! – 2012-09-22 06:50:32

回答

51

它沒有損壞。 SkipWhile只會跳過IEnumerable<T>開頭的項目。一旦條件不滿足,它會愉快地採取其餘的元素。後來在道路上匹配的其他元素將不會被跳過。

int[] sequence = { 3, 3, 1, 1, 2, 3 }; 
var result = sequence.SkipWhile(i => i == 3); 
// Result: 1, 1, 2, 3 
+0

啊,現在我明白了。謝謝艾哈邁德。 – 2010-03-26 22:20:56

+7

我剛剛被燒燬,因爲MSDN文檔沒有指定。是什麼賦予了? http://msdn.microsoft.com/en-us/library/system.linq.enumerable.skipwhile(v=vs.90).aspx – 2012-09-12 19:28:47

+6

@StanR。 - 也許你需要更仔細地閱讀文檔? 「只要指定的條件爲真*,然後返回其餘元素***」 – JDB 2012-09-28 17:05:48

17
var result = sequence.Where(i => i != 3); 
+1

或TakeWhile(i => i!= 3) – Nagg 2010-03-26 22:08:57

+9

@Nagg'TakeWhile'將在以3開頭的序列中返回任何內容,例如'{3,1,2,3}'。期望的結果是過濾掉所有3,這是'Where'的用途。 – 2010-03-26 22:14:14

+0

呃,哇,星期五好吧。當然,操作員會在那裏做這個伎倆。 [咄]。儘管如此,沒有回答爲什麼SkipWhile不能按預期工作。 – 2010-03-26 22:20:29

1

艾哈邁德已經回答了你的問題,但這裏的另一種選擇:

var result = from i in sequence where i != 3 select i; 
2

的SkipWhile和TakeWhile運營商跳過或同時斷言函數傳遞(返回True)從一個序列返回元素。不通過謂詞函數的第一個元素結束了評估過程。

//只要指定的條件爲真,就會跳過序列中的元素並返回其餘元素。

2

您可能會覺得有用的一個解決方案是使用List「FindAll」函數。

List <int> aggregator = new List<int> { 1, 2, 3, 3, 3, 4 }; 
List<int> result = aggregator.FindAll(b => b != 3);