如何在switch 块内打破foreach循环?

通常,您使用break,但如果在switch 块中使用break,它只会使您脱离switch 块,foreach循环将继续执行:

foreach (var v in myCollection)
{
    switch (v.id)
    {
        case 1:
            if (true)
            {
                break;
            }
            break;
        case 2;
            break
    }
}

当我在switch块内需要跳出foreach时,我目前正在做的是将循环外的bool值设置为真,并在每次输入foreach时和进入switch 块之前判断这个布尔值.比如:

bool exitLoop;
foreach (var v in myCollection)
{
    if (exitLoop) break;
    switch (v.id)
    {
        case 1:
            if (true)
            {
                exitLoop = true;
                break;
            }
            break;
        case 2;
            break
    }
}

这很管用,但我一直在想,肯定有更好的方法来做这件事,我不知道……

编辑:想知道为什么这没有像@jon_Darkstar提到的那样在.NET中实现,就像它在PHP中真正整洁的工作方式一样?

$i = 0;
while (++$i) {
    switch ($i) {
    case 5:
        echo "At 5<br />\n";
        break 1;  /* Exit only the switch. */
    case 10:
        echo "At 10; quitting<br />\n";
        break 2;  /* Exit the switch and the while. */
    default:
        break;
    }
}

推荐答案

在这种情况下,您的解决方案几乎是最常见的 Select .话虽如此,我还是把你的出境支票放在最后:

bool exitLoop;
foreach (var v in myCollection)
{
    switch (v.id)
    {
        case 1:
            if (true)
            {
                exitLoop = true;
            }
            break;
        case 2;
            break
    }

    // This saves an iteration of the foreach...
    if (exitLoop) break;
}

另一个主要 Select 是重构您的代码,并将switch语句和foreach循环拉出到一个单独的方法中.然后,您可以只从switch语句中 Select return个.

.net相关问答推荐

System.IO.Directory.Exists 在 LINQ 语句中失败,但在 foreach 循环中没有

MongoDB GridFs with C#,如何存储图片等文件?

是否可以像 WebView 一样在 Windows 窗体中嵌入 Gecko 或 Webkit?

Style 和 ControlTemplate 的区别

不同命名空间中的部分类

使用 Task.Factory.StartNew 传递方法参数

C# 是否(或将)包含用于副作用验证的功能?

如何防止和/或处理 StackOverflowException?

如何明智地使用 StringBuilder?

在 JavaScript 中使用 String.Format?

如何结合 ||条件语句中的运算符

何时在 C#/.NET 中使用指针?

如何确定字符串是 C# 中的有效 IPv4 还是 IPv6 地址?

C# - 你如何停止计时器?

场与财产.性能优化

您可以使用 Xamarin 开发 Linux 应用程序吗?

CI服务器的比较?

从 'System.Int32' 到 'System.Nullable`1[[System.Int32, mscorlib]] 的无效转换

嵌套的 Try/Catch 块是个坏主意吗?

模拟和单元测试需要时如何抛出 SqlException?