English 中文(简体)
从开关栏中打破ach形
原标题:Breaking out of a foreach loop from within a switch block
  • 时间:2010-10-28 16:02:16
  •  标签:
  • c#
  • .net

在开关栏内,你如何打破海滩通道?

通常,你使用断肢,但如果你在开关栏内使用断裂缝,那么你就只能从开关车中走出去, for子将继续执行:

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

当我需要打破<代码>foreach时,在switch内,我现在做些什么。 栏目为<代码>bool 输入<代码>foreach,并在进入开关栏之前,将这一羊毛的价值置于 lo之外。 与此类似:

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

但我仍然认为,必须找到更好的办法,使我不知道......。

EDIT: 为什么没有执行。 NET the really neat way it work in PHP, 详见@jon_darkstar?

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

你的解决方案在很大程度上是本案中最常见的选择。 顺便说一句,我最后对你们的撤离进行检查:

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

另一项主要选择是重新确定你的代码,将开关声明和ach带走单独的方法。 然后,从开关说明中看,你只能读到<代码>return。

问题回答

细菌是一种方式。 另一种是使用标签和 go。 我知道民俗会认为自己是心脏病,但明智地加以使用(据判断,这是有益的)。 在这种情况下,就贴上了前 for的标签。 当你想离开时,就只贴上这一标签。 例如:

foreach(var v in myCollection) {
    switch(v.Id) {
        case 1:
            if(true) {
                goto end_foreach;
            }
            break;
        case 2:
            break;
    }
}
end_foreach:
// ... code after the loop

EDIT:一些人提到将 lo带进一种单独的方法,以便你能够使用返回。 我认为这样做的好处,因为它不需要去做,而且它也简化了包含 lo的原始功能。 然而,如果 lo体是简单的,并且是包含它的职能的主要目的,或者如果 lo权使用外变数或反射变量,那么它可能最好留给它去做和使用。 事实上,由于 go子和标签已经过时,因此可能使代码clear而不是cl。 将它单独置于一项职能中,可能会使简单的法典难以读懂。

您可提取每一周期的不同方法,并使用<代码>return说明。 或者你可以这样做:

        foreach (object collectionElement in myCollection)
        {
            if (ProcessElementAndDetermineIfStop(collectionElement))
            {
                break;
            }
        }

        private bool ProcessElementAndDetermineIfStop(object collectionElement)
        {
            switch (v.id)
            {
                case 1:
                    return true; // break cycle.
                case 2;
                    return false; // do not break cycle.
            }
        }

Hon? 或许这是完全有效且适当使用http://msdn.microsoft.com/en-us/library/13940fs2(VS.71).aspx“rel=”>>goto:

foreach (var v in myCollection) {
    switch (v.id) {
        case 1:
            if (true)
                // document why we re using goto
                goto finished;
            break;
        case 2;
            break
    }
}
finished: // document why I m here

这实际上与你的<代码>exitLoop的旗帜不同,但如果你提取一种方法,则可能更可读。

foreach (var v in myCollection)
{
    if(!DoStuffAndContinue(v))
        break;
}


bool DoStuffAndContinue(MyType v)
{
    switch (v.id)
    {
        case 1:
            if (ShouldBreakOutOfLoop(v))
            {
                return false;
            }
            break;
        case 2;
            break;
    }
    return true;
}

总是可以选择调整你的代码,以便你能够从<代码>switch上填写。

我知道,但大家都可以这样做。

你们总是能够把它变成 lo,并作为必须满足的条件,增加出路。 在开关时,你可以呼吁继续绕过目前通行证的其余部分,并且因为你会把出路变成假,这样就离开了。 即便这并非是你要求什么,但也许会越是这样说?

You can do it with Try/Catch.. But it might not be the best idea in the world, because it causes performance problems and does show nasty lines in the debug window.

try
{ 
foreach (var v in myCollection)
    {
        switch (v.id)
        {
            case 1:
                if (true)
                {
                    throw new SystemException("Break");
                }
                break;
            case 2;
                break;
        }
    }
} catch {}

将开关声明改为if(......) 否则,如果(......)其他,则改为系列声明,以便break 离开<代码>foreach( loop)。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...