LINQ - SkipWhile 损坏了吗?

问题描述 投票:0回答:6

我有点惊讶地发现以下代码的结果,我只是想从整数序列中删除所有 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 不跳过最后一个 元素,即使它匹配 健康)状况。咕噜。

有人可以解释为什么 SkipWhile 不跳过最后一个元素吗?谁能建议我可以使用什么 LINQ 运算符从上面的序列中删除“3”?

c# linq linq-to-objects
6个回答
68
投票

没有坏掉。

SkipWhile
只会跳过
IEnumerable<T>
开头的项目。一旦这个条件不满足,它就会很乐意接受其余的元素。以后与其匹配的其他元素将不会被跳过。

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

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

4
投票

当谓词函数通过(返回 True)时,SkipWhile 和 TakeWhile 运算符会跳过或返回序列中的元素。第一个未通过谓词函数的元素结束评估过程。

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


3
投票

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

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

2
投票

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

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

0
投票

只要指定条件为真,就绕过序列中的元素,然后返回剩余元素。

你仍然想使用skipwhile,然后按顺序执行,然后应用skipwhile

© www.soinside.com 2019 - 2024. All rights reserved.