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

问题描述 投票:0回答:6

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

是否可以使用 switch case 来实现这种事情,或者还有其他方法来实现吗?

可以实现吗?如果没有的话,还有其他方法可以实现吗?

c# .net silverlight switch-statement
6个回答
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");
     }
}

3
投票

您可以使用 goto 案例。

一个常见的用例是当您希望一个案例运行到下一个案例时。

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
投票

或者你可以放弃案例陈述并做类似的事情:

    //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);

1
投票

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

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

for example

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

   }
}
found:
   //Your Code

关于 GOTO 的 MSDN 参考

像返回 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
     }
} 

0
投票

使用本地函数并在案例中调用它们。

© www.soinside.com 2019 - 2024. All rights reserved.