Linq TakeWhile循环,只给出第一个结果

时间:2015-05-04 16:19:51

标签: c# linq

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

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

在现实世界的场景中,这是一个很大的逻辑循环,因此我无法承担在循环之外进行的操作。我尝试过使用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()));
    }
}

1 个答案:

答案 0 :(得分:2)

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

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

所以,显然第一个条件本身会失败,即i.testNum >= 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()));