LINQ - SkipWhile坏了吗?

时间:2010-03-26 22:02:25

标签: 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 }

为什么不跳过3?

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

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

总之,

  • 除了删除3,但也 删除非独特元素。格儿。
  • SkipWhile不跳过最后一个 元素,即使它匹配 条件。 GRR。

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

5 个答案:

答案 0 :(得分:57)

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

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

答案 1 :(得分:19)

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

答案 2 :(得分:3)

SkipWhile和TakeWhile操作符在谓词函数通过时跳过或返回序列中的元素(返回True)。没有通过谓词函数的第一个元素结束了评估过程。

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

答案 3 :(得分:2)

您可能会发现一个有用的解决方案是使用List“FindAll”功能。

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

答案 4 :(得分:1)

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

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