LINQ – SkipWhile坏了吗?
我有点惊讶地发现以下代码的结果,我只想从一系列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’?
它并没有坏掉。 SkipWhile
只会跳过IEnumerable
开头的项目。 一旦不满足该条件,它将很乐意接受其余的元素。 之后在路上匹配的其他元素将不会被跳过。
int[] sequence = { 3, 3, 1, 1, 2, 3 }; var result = sequence.SkipWhile(i => i == 3); // Result: 1, 1, 2, 3
var result = sequence.Where(i => i != 3);
当谓词函数通过时,SkipWhile和TakeWhile操作符跳过或返回序列中的元素(返回True)。 未通过谓词函数的第一个元素结束了评估过程。
//只要指定的条件为真,就会跳过序列中的元素并返回其余元素。
您可能会发现一个有用的解决方案是使用List“FindAll”function。
List aggregator = new List { 1, 2, 3, 3, 3, 4 }; List result = aggregator.FindAll(b => b != 3);
艾哈迈德已经回答了你的问题,但这是另一种选择:
var result = from i in sequence where i != 3 select i;