可能重复:
Breaking out of a nested loop
How to break out of 2 loops without a flag variable in C#?
你好我有一个嵌套循环的函数。一旦满足条件,我想打破嵌套循环。代码如下所示:
foreach (EmpowerTaxView taxView in taxViews)
{
foreach (PayrollEmployee payrollEmployee in payrollEmployees)
{
//PayStub payStub = payrollEmployee.InternalPayStub;
IReadOnlyList<PayrollWorkLocation> payrollWorkLocations = payrollEmployee.PayrollWorkLocations;
foreach (PayrollWorkLocation payrollWorkLocation in payrollWorkLocations)
{
Tax tax = GetTaxEntity(payrollWorkLocation, taxView.BSITypeCode, taxView.BSIAuthorityCode,
paidbyEr, resCode);
if (tax != null && tax.Rate.HasValue)
{
taxRate = tax.Rate.Value;
break;
}
}
}
}
不幸的是,休息只出现在一个循环中。我想打破这一切。拜托,我知道有些人建议转到:声明。我想知道是否有其他方法,比如写一些LINQ查询到同样的效果。
非常感谢任何想法和建议!
答案 0 :(得分:4)
两个选项建议自己作为退出的方式而没有额外的标志变量来表示“你应该突破内循环”。 (我个人不喜欢这样的变数。
一个选项是将所有这些代码拉入一个单独的方法 - 然后您可以从该方法返回。无论如何,这可能会提高你的代码可读性 - 这真的感觉它足以保证提取到一个单独的方法。
另一个明显的选择是使用LINQ。这是一个我认为可行的例子:
var taxRate = (from taxView in taxViews
from employee in payrollEmployees
from location in employee.PayrollWorkLocations
let tax = GetTaxEntity(location, taxView.BSITypeCode,
taxView.BSIAuthorityCode,
paidbyEr, resCode)
where tax != null && tax.Rate.HasValue
select tax.Rate).FirstOrDefault();
对我而言,这看起来比许多foreach
循环要清晰得多。
请注意,我尚未选择tax.Rate.Value
- 仅tax.Rate
。这意味着如果没有找到匹配的费率,结果将是“空”decimal?
(或任何类型tax.Rate
),否则结果将是。那你就得了:
if (taxRate != null)
{
// Use taxRate.Value here
}
答案 1 :(得分:2)
好吧,你可以使用可怕的goto
,重构你的代码,或者:
// anon-method
Action work = delegate
{
for (int x = 0; x < 100; x++)
{
for (int y = 0; y < 100; y++)
{
return; // exits anon-method
}
}
};
work(); // execute anon-method
答案 2 :(得分:0)
您可以使用标志变量。
bool doMainBreak = false;
foreach (EmpowerTaxView taxView in taxViews)
{
if (doMainBreak) break;
foreach (PayrollEmployee payrollEmployee in payrollEmployees)
{
if (doMainBreak) break;
//PayStub payStub = payrollEmployee.InternalPayStub;
IReadOnlyList<PayrollWorkLocation> payrollWorkLocations = payrollEmployee.PayrollWorkLocations;
foreach (PayrollWorkLocation payrollWorkLocation in payrollWorkLocations)
{
Tax tax = GetTaxEntity(payrollWorkLocation, taxView.BSITypeCode, taxView.BSIAuthorityCode,
paidbyEr, resCode);
if (tax != null && tax.Rate.HasValue)
{
taxRate = tax.Rate.Value;
doMainBreak = true;
break;
}
}
}
}