【问题标题】:LINQ - is SkipWhile broken?LINQ - SkipWhile 坏了吗?
【发布时间】:2010-03-26 22:02:25
【问题描述】:

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

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

【问题讨论】:

  • 认为它是 SkipWhile(true)。所以,你的第一个条件 (i==3) 失败了。所以,它变成了 SkipWhile(false) 那么接下来会发生什么?它返回所有剩余的元素!

标签: c# linq linq-to-objects


【解决方案1】:

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

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

【讨论】:

  • 我只是被这个烧死了,因为 MSDN 文档没有具体说明。是什么赋予了? msdn.microsoft.com/en-us/library/…
  • @StanR。 - 也许您需要更仔细地阅读文档? "绕过序列中的元素只要指定条件为真 然后返回剩余的元素"
  • @Cyborgx37 很抱歉,该文档含糊不清且具有误导性。剩余元素不表示剩余元素。在这种情况下,它的意思是“与指定条件不匹配的剩余元素”。如果文档像您认为的那样清晰,那么在 SO 上询问有关它的问题不会引起足够的混乱。
  • @StanR。 - 并不是说​​它是世界上最清晰的文档,但如果你仔细阅读它,它确实说明了该函数的作用。
  • @Cyborgx37 是的,这是真的,但对于另一种情况也可以这样说。基本上文档是模棱两可的。
【解决方案2】:
var result = sequence.Where(i => i != 3);

【讨论】:

  • @Nagg TakeWhile 不会返回以 3 开头的序列,例如 {3,1,2,3}。想要的结果是过滤掉所有的 3,这就是 Where 的用途。
  • 呃,哇,周五了。当然,运营商会在哪里解决问题。 [呃]。仍然没有回答为什么 SkipWhile 不能按预期工作。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    Ahmad 已经回答了您的问题,但这里有另一种选择:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-21
        • 2021-12-31
        • 2015-03-04
        • 2016-09-08
        • 2011-07-14
        • 2020-09-01
        相关资源
        最近更新 更多