如果循环体不会产生副作用,而只是在寻找“某些”为真的第一个值,那么通过首先消除所有循环来解决问题。
var query = from I in Enumerable.Range(0, 10)
from A in Enumerable.Range(0, 10)
from B in Enumerable.Range(0, 10)
where something(I, A, B)
select new { I, A, B };
var result = query.FirstOrDefault();
if (result == null)
{
Console.WriteLine("no result");
}
else
{
Console.WriteLine("The first result matching the predicate was {0} {1} {2},
result.I, result.A, result.B);
}
但是,如果循环有副作用,不要这样做;查询是一个非常糟糕的地方放置副作用。如果内环有副作用,那么你可以做这样的事情:
var triples = from I in Enumerable.Range(0, 10)
from A in Enumerable.Range(0, 10)
from B in Enumerable.Range(0, 10)
select new { I, A, B };
foreach(var triple in triples)
{
if (something(triple.I, triple.A, triple.B))
break;
DoSomeSideEffect(triple.I, triple.A, triple.B);
}
,现在只有一个循环打出来的,而不是三个。
请注意,您当前的“修复”仍然会延续中间循环,这可能会涉及更多的内部循环迭代。你需要'I = A = 10;' – 2011-06-01 12:24:30
添加一个布尔并检查它? – Foresp 2011-06-01 13:54:04
这怎么能不重复? – ripper234 2011-06-27 14:18:33