我在循环中使用了一个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()));
}
}
答案 0 :(得分:2)
我不确定你要从中实现什么,但你的代码问题是,当你第二次循环执行时,即testNum
为2
你的查询如下所示: -
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()));