如何打破嵌套的for循环

时间:2011-08-08 21:13:53

标签: c# loops

  

可能重复:
  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查询到同样的效果。

非常感谢任何想法和建议!

3 个答案:

答案 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;
            }
        }
    }
}