LINQ - SkipWhile坏了吗?

Jud*_*ngo 27 c# linq linq-to-objects

我有点惊讶地发现以下代码的结果,我只想从一系列int中删除所有3:

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

为什么不跳过3?

我的下一个想法是,好吧,Except运算符可以解决这个问题:

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

综上所述,

  • 除了删除3,但也删除非不同的元素.格儿.
  • SkipWhile不跳过最后一个元素,即使它与条件匹配.格儿.

有人可以解释为什么SkipWhile不会跳过最后一个元素吗?任何人都可以建议我可以用什么LINQ运算符从上面的序列中删除'3'?

Ahm*_*eed 57

它没有被打破.SkipWhile只会跳过开头的项目IEnumerable<T>.一旦不满足该条件,它将很乐意接受其余的元素.之后在路上匹配的其他元素将不会被跳过.

int[] sequence = { 3, 3, 1, 1, 2, 3 };
var result = sequence.SkipWhile(i => i == 3); 
// Result: 1, 1, 2, 3
Run Code Online (Sandbox Code Playgroud)

  • @ Cyborgx37对不起,文档含糊不清,误导性.剩余的元素不**表示**元素的剩余**.在此上下文中,它表示"与指定条件不匹配的剩余元素".如果文档尽可能清晰,那就不会引起足够的混淆,在SO上提出问题. (17认同)
  • 我刚被这个烧毁,因为MSDN文档没有指定.是什么赋予了?http://msdn.microsoft.com/en-us/library/system.linq.enumerable.skipwhile(v=vs.90).aspx (7认同)
  • @StanR. - 也许您需要更仔细地阅读文档?"序列中的旁路元素*只要指定的条件为真****然后返回剩余的元素***" (7认同)
  • @StanR. - 并不是说​​它是世界上最清晰的文档,但它确实说明了如果你仔细阅读它的功能. (3认同)
  • @ Cyborgx37是的,这是真的,但对于另一种情况也是如此.基本上文档是模棱两可的. (3认同)

eri*_*len 19

var result = sequence.Where(i => i != 3);
Run Code Online (Sandbox Code Playgroud)

  • @Nagg`TakeWhile`将不会返回以3开头的序列,例如`{3,1,2,3}`.期望的结果是过滤掉所有3,这就是`Where`的用途. (10认同)