如何使用C#在switch-case条件语句中根据当前case语句的值跳转到另一个case语句

3

如何在switch-case条件语句中使用当前case语句的值跳转到另一个case语句?

是否可以使用switch case实现此类功能,或者是否有其他方法来实现它?

能否实现此功能?如果不能,那么是否有其他方法可以实现它?


不清楚您为什么在这里使用了“goto”。由于缺少很多上下文,情况变得更加复杂。您能提供一个简短但完整的示例吗?您所说的“另一个属于另一个case语句的函数”是什么意思?函数如何属于某个case语句? - Jon Skeet
@AnthonyRussell 是的,我试过了,但它不起作用。但如果有人知道任何替代方法,我想要尝试。 - Sss
1
如果我理解正确的话,他想要进入case Combo,并且如果需要,根据if语句跳转到case Slider - TyCobb
@TyCobb 没错。如果我得到了“returnComboItemSelect ==“Slider””,但是带有returnComboItemSelect值,我想跳转到case slider。这可行吗? - Sss
@JonSkeet请查看修改过的代码。我已经删除了令人困惑的部分。如果您知道任何其他实现方式,请告诉我是否可能? - Sss
显示剩余3条评论
5个回答

5

这段代码是有效的:

    switch (this.Name)
    {
    case "":
        if (this.Owner == null)
        {
            goto DoBill;
        }
        break;
    case "Bill":
    DoBill:
        break;
    }

然而,任何实际这样做的人都应该被枪毙。或者至少要严厉地谈话。为什么不做明智的事呢?
switch (param.Component.Type)
    {
        case "Combo":
            returnComboItemSelect = generateCB(param);
             if(returnComboItemSelect=="Slider")
             {
               returnSomething  = generateSl(param,returnComboItemSelect); //I mean no need to jump
             }
            break;                            
        case "List":
            returnSomething = generateL(param);
            break;
        case "Slider":
            returnSomething 
.....

严肃地说,如果您开始在case语句之间跳跃,那么您就不应该使用它们。我对上面的代码也不太感兴趣(有重复,但有时候......)

3
您可以在 switch 语句周围加上 while 循环,并在完成后跳出循环。
var keepLooping = true;
var switchCaseSwitch = param.Component.Type;

while(keepLooping)
{
    switch (switchCaseSwitch)
    {
        case "Combo":
            returnComboItemSelect = generateCB(param);
            if (returnComboItemSelect == "Slider")
            {
                switchCaseSwitch = "Slider";
            }
            else
            {
                keepLooping = false;
            }
            break;                            
        case "List":
            returnSomething = generateL(param);
            keepLooping = false;
            break;
        case "Slider":
            returnSomething = generateSl(param,1);
            keepLooping = false;
            break;
        case "RadioButtons":
            returnSomething = generateRB(param);
            keepLooping = false;
            break;
        case "CheckBox":
            returnSomething = generateCHB(param,flag);
            keepLooping = false;
            break;
        default:
            throw new Exception("Unknown component type");
     }
}

2

你可以使用goto case。

常见的用例是当你想让一个case运行到下一个case时。

switch ( arg )
{
    case "-file":
        if ( (i + 1) < args.Length && !args[i + 1].StartsWith("-") )
            inputBox.Text = args[++i];
        break;
    case "-language":
        _loadSelectedLanguagesAsALanguageSet = true;
        goto case "-select";
    case "-select":
        if ( (i + 1) < args.Length && !args[i + 1].StartsWith("-") )
            _loadSelectedLanguageFileOnStartup = args[++i];
        break;
}

1

我认为重新思考你的架构会更好。

如今,人们不倾向于在C#中使用GOTO,除非他们试图打破嵌套循环。

for example

foreach(var item in items){
   foreach(var name in item.people){
      if(name == WhatIAmSearchingFor)
        goto found;

   }
}
found:
   //Your Code

MSDN GOTO参考

将一个Func和一组参数的属性包返回是更清晰的方法。或者像下面的示例中所示,只需使用第一个参数,然后使用某种枚举或标志。而不是传递一个空值,只需将其设置为0。

这里有一个关于如何实现这个功能的S.O.答案 C#方法能够返回另一个方法吗?

所以在你的例子中,你可以这样做

public Func<ParamType,int> YourMethodName{

    YourSwitch{
       case(1)
         return YourClassName.YourMethod;
       break;
       case(2)
         return YourClassName.YourMethod2;
       break
       case(3)
         return YourClassName.YourMethod3;
       break
     }
} 

1

或者你可以放弃使用 case 语句,尝试像这样做:

    //Setup
    var selector = new Dictionary<string, Func<Param, string, string>>();
    selector.Add("Combo", (p, flag) =>
        {
            var returnComboItemSelect = generateCB(p);
            if (returnComboItemSelect == "Slider")
            {
                return selector["Slider"](p, returnComboItemSelect);
            }
            return returnComboItemSelect;
        });
    selector.Add("List", (p, flag) => { return generateL(p); });
    selector.Add("Slider", (p, flag) => { return generateSL(p, flag); });
    selector.Add("RadioButtons", (p, flag) => { return generateRB(p); });
    selector.Add("CheckBox", (p, flag) => { return generateCHB(p, flag); });


    //use
    var result = selector[param.Component.Type](param, flag);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接