如果循環體不會產生副作用,而只是在尋找「某些」爲真的第一個值,那麼通過首先消除所有循環來解決問題。
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