【问题标题】:How to break out of a List<T>.ForEach() loop from within an if statement in C#如何从 C# 中的 if 语句中跳出 List<T>.ForEach() 循环
【发布时间】:2012-07-26 15:36:05
【问题描述】:

我想从if 语句中跳过List&lt;T&gt;.ForEach() 循环的迭代。

我有代码:

        instructions.ForEach(delegate(Instruction inst)
        {                
            if (!File.Exists(inst.file))
            {
                continue; // Jump to next iteration
            }

            Console.WriteLine(inst.file);
        });

但是编译器声明没有什么可以跳出来的(大概是因为它似乎将 if 块作为封闭块?)。

有没有办法做到以上几点? parentblock.continue; 之类的东西。

谢谢

【问题讨论】:

  • for 循环或 foreach 有什么问题?
  • 这不是你问题的答案,但为什么不把它作为一个积极的检查并将你的逻辑移到 if 中呢? if (File.Exists){do stuff} 而不是如果不继续?

标签: c# for-loop foreach


【解决方案1】:

使用return 语句代替continue。请记住,通过使用 ForEach 扩展方法,您正在为每个项目执行一个函数,其主体在 { 和 } 之间指定。通过退出函数,它将继续使用列表中的下一个值。

【讨论】:

  • 如果它不存在就返回,为什么不直接打印它,如果它存在。
【解决方案2】:

ForEach 在这种情况下只是为列表中的每个项目执行委托的方法。它不是一个循环控制结构,所以continue 不能出现在那里。将其重写为普通的foreach 循环:

foreach (var inst in instructions) {
    if (!File.Exists(inst.file))
    {
        continue; // Jump to next iteration
    }

    Console.WriteLine(inst.file);
}

【讨论】:

  • 谢谢,我正在尝试使用原始方法,因为它超出了我的舒适区和良好的学习曲线。
  • @RodgersandHammertime 许多专家一开始是not considered a good practice。老实说,我完全不鼓励你使用它。与其想办法用困难的方式做简单的事情,不如想办法用简单的方式做困难的事情。
【解决方案3】:

使用 LINQ 的 Where 子句从一开始就应用谓词

foreach(Instruction inst in instructions.Where(i => File.Exists(i.file))){
    Console.WriteLine(inst.file);
}

【讨论】:

  • 嘿,不错,但不应该是 OP 选择的解决方案 ;-)
【解决方案4】:

发送到 ForEach 函数的委托将对指令列表中的每个项目运行一次。要让它跳过一项,只需从委托函数返回即可。

    instructions.ForEach(delegate(Instruction inst)
    {                
        if (!File.Exists(inst.file))
        {
            return; // Jump to next iteration
        }

        Console.WriteLine(inst.file);
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2017-06-16
    • 1970-01-01
    • 2012-06-22
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多