LINQ - 是SkipWhile破?
我有点惊讶地发现下面的代码,在这里我只是想从整数序列中删除所有3S的结果:LINQ - 是SkipWhile破?
var sequence = new [] { 1, 1, 2, 3 };
var result = sequence.SkipWhile(i => i == 3); // Oh noes! Returns { 1, 1, 2, 3 }
为什么不跳过3?
我的下一个想法是,确定,除了运营商将这样的伎俩:
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<T>
开头的项目。一旦条件不满足,它会愉快地采取其余的元素。后来在道路上匹配的其他元素将不会被跳过。
int[] sequence = { 3, 3, 1, 1, 2, 3 };
var result = sequence.SkipWhile(i => i == 3);
// Result: 1, 1, 2, 3
啊,现在我明白了。谢谢艾哈迈德。 – 2010-03-26 22:20:56
我刚刚被烧毁,因为MSDN文档没有指定。是什么赋予了? http://msdn.microsoft.com/en-us/library/system.linq.enumerable.skipwhile(v=vs.90).aspx – 2012-09-12 19:28:47
@StanR。 - 也许你需要更仔细地阅读文档? “只要指定的条件为真*,然后返回其余元素***” – JDB 2012-09-28 17:05:48
var result = sequence.Where(i => i != 3);
或TakeWhile(i => i!= 3) – Nagg 2010-03-26 22:08:57
@Nagg'TakeWhile'将在以3开头的序列中返回任何内容,例如'{3,1,2,3}'。期望的结果是过滤掉所有3,这是'Where'的用途。 – 2010-03-26 22:14:14
呃,哇,星期五好吧。当然,操作员会在那里做这个伎俩。 [咄]。尽管如此,没有回答为什么SkipWhile不能按预期工作。 – 2010-03-26 22:20:29
艾哈迈德已经回答了你的问题,但这里的另一种选择:
var result = from i in sequence where i != 3 select i;
的SkipWhile和TakeWhile运营商跳过或同时断言函数传递(返回True)从一个序列返回元素。不通过谓词函数的第一个元素结束了评估过程。
//只要指定的条件为真,就会跳过序列中的元素并返回其余元素。
您可能会觉得有用的一个解决方案是使用List“FindAll”函数。
List <int> aggregator = new List<int> { 1, 2, 3, 3, 3, 4 };
List<int> result = aggregator.FindAll(b => b != 3);
认为它是SkipWhile(true)。所以,你的第一个条件(i == 3)失败。所以,它变成了SkipWhile(false),接下来会发生什么?它会返回剩余的每个元素! – 2012-09-22 06:50:32