【问题标题】:Linq TakeWhile in loop, giving only first resultLinq TakeWhile 在循环中,只给出第一个结果
【发布时间】:2015-05-05 01:56:04
【问题描述】:

我在循环中使用了一个 takewhile 语句,它只在循环的第一次迭代中给出结果。所有后续迭代都没有产生结果,尽管我希望它们会产生结果。

例如下面的代码。第一次迭代将给出字符串 a="blah1blah2blah3"。在第二次迭代中,我期望 a="blah2blah3",但 takewhile 没有给出任何 a="",它没有得到任何元素。

在现实世界的场景中,这是一个很大的逻辑循环,所以我不能在循环之外执行 takewhile。我尝试使用 count() 和 take() 的组合,但是 count() 给出了所有符合条件的元素,而不是在条件为 false 之前符合条件的项目的计数。

任何帮助都会很有用,谢谢。

代码:

public void blah()
{
    List<testclass> someStrings = new List<testclass>() 
    { new testclass() { name = "blah1", testNum = 1 },
      new testclass() { name = "blah2", testNum = 2 },
      new testclass() { name = "blah3", testNum = 3 },
      new testclass() { name = "none4", testNum = 4 },
      new testclass() { name = "blah5", testNum = 5 },
      new testclass() { name = "blah6", testNum = 6 },
      new testclass() { name = "none7", testNum = 7 } 
    };

    foreach (testclass tc in someStrings)
    {
       string a = string.Join("", someStrings.TakeWhile(i => i.name.Contains("blah") 
                           && i.testNum >= tc.testNum).Select(g => g.name.ToString()));
    }
}

【问题讨论】:

  • 对,因为它从头开始,而不是从您当前的元素开始。你想skipWhile你还没有到达元素,然后才到达takeWhile,但是测量性能这在大集合上可能会很慢,一个简单的for循环也可以解决它。
  • 在您展示的示例中,a 未被使用,并且可以在代码运行之前的某个时间点完全优化。您需要实际使用您的结果(例如,将其写入控制台或文本文件)以使结果具有任何意义。
  • @SébastienSevrin 为什么会有帮助?
  • 你可以用string.Concat代替string.Join
  • 如果.name 是编译时string.name.ToString() 没有意义。

标签: c# linq


【解决方案1】:

我不确定您要从中实现什么,但是您的代码的问题是,当您第二次循环执行时,即对于 testNum as 2,您的查询如下所示:-

string a = someStrings.Where(i => i.name.Contains("blah")
                                    && i.testNum >= 2).Select(g => g.name.ToString());

因此,显然第一个条件本身将失败,即 i.testNum &gt;= 2 对于包含 1 的第一个元素,您将一无所获或 String.Empty 作为输出。

据我了解,您可以按照@CodeDennis 的建议在之前添加SkipWhile 以跳过以前的记录,如下所示:-

string a = string.Join("", someStrings.SkipWhile(i => i.testNum < tc.testNum)
            .TakeWhile(i => i.name.Contains("blah") && i.testNum >= tc.testNum)
            .Select(g => g.name.ToString()));

【讨论】:

  • 啊,好吧,我知道发生了什么。至于分辨率我不确定。
  • 我不认为 Where 会给出正确的结果,但是 +1 用于确定为什么在循环的第二次迭代中没有返回结果。 SkipWhileTakeWhile 的组合应该可以做到。
  • 谢谢,这正是我想要的。现在我对 takewhile 及其局限性有了更好的理解,它只评估到第一个错误,然后从不重新评估。使用skipwhile是诀窍。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2014-07-17
  • 1970-01-01
  • 2020-04-27
  • 2020-03-24
  • 2011-09-26
  • 1970-01-01
相关资源
最近更新 更多