LINQ - 是SkipWhile破?

LINQ - 是SkipWhile破?

问题描述:

我有点惊讶地发现下面的代码,在这里我只是想从整数序列中删除所有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

它没有损坏。 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

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

艾哈迈德已经回答了你的问题,但这里的另一种选择:

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

的SkipWhile和TakeWhile运营商跳过或同时断言函数传递(返回True)从一个序列返回元素。不通过谓词函数的第一个元素结束了评估过程。

//只要指定的条件为真,就会跳过序列中的元素并返回其余元素。

您可能会觉得有用的一个解决方案是使用List“FindAll”函数。

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