LINQ -SkipWhile是否已损坏?

zphenhs4  于 2023-09-28  发布在  其他
关注(0)|答案(6)|浏览(106)

我有点惊讶地发现以下代码的结果,我只是想从一个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不会跳过最后一个元素,即使它与条件匹配。呃

有人能解释一下为什么SkipWhile不跳过最后一个元素吗?谁能建议我用什么LINQ操作符从上面的序列中删除'3'?

ufj5ltwl

ufj5ltwl1#

它没坏。SkipWhile只会跳过IEnumerable<T>开头的项目。一旦这个条件不满足,它将很高兴地采取其余的元素。以后与之匹配的其他元素将不会被跳过。

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

ujv3wf0j2#

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

vmdwslir3#

SkipWhile和TakeWhile操作符在 predicate 函数通过时跳过或返回序列中的元素(返回True)。第一个没有通过 predicate 函数的元素结束求值过程。
//只要指定的条件为真,就跳过序列中的元素,并返回剩余的元素。

pexxcrt2

pexxcrt24#

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

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

eyh26e7m5#

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

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

ax6ht2ek6#

只要指定的条件为真,就跳过序列中的元素,然后返回剩余的元素。
你仍然想使用skipwhile然后做orderby然后应用skipwhile

相关问题