繁体   English   中英

Linq TakeWhile在循环中,仅给出第一个结果

[英]Linq TakeWhile in loop, giving only first result

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

例如下面的代码。 第一次迭代将给出字符串a =“ blah1blah2blah3”。 在第二次迭代中,我期望a =“ blah2blah3”,但是需要的时间却没有给出a =“”,它没有任何元素。

在现实世界中,这是一个很大的逻辑循环,因此我无法承担超出循环的时间。 我试过使用count()和take()的组合,但是count()给出了所有符合条件的元素,而不是符合条件的项目计数,直到条件为假。

任何帮助将是有用的,谢谢。

码:

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()));
    }
}

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

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

因此,显然第一个条件本身将失败,即,对于包含1第一个元素, i.testNum >= 2 ,您将不会获得任何结果或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()));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM