Как перейти к другой инструкции case в условии switch-case со значением текущей инструкции case с использованием C #

1

Как я могу перейти к другому аргументу case в состоянии switch-case со значением текущего оператора case?

Возможно ли реализовать подобные вещи с помощью корпуса коммутатора или есть ли другой способ его реализации?

Можно ли достичь? Если нет, то есть ли другой способ его достижения?

Теги:
switch-statement
silverlight

4 ответа

3

Этот код работает:

    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 
.....

Серьезно, если вы начнете прыгать между заявлениями о случаях, вы не должны их использовать. Я не слишком увлечен кодом выше (дублирование, но иногда...)

  • 0
    Хорошо, спасибо, позвольте мне попробовать, если это работает.
2

Вы могли бы, но в то же время, обойти оператор switch и выйти из цикла, когда все будет готово.

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

Я думаю, вам будет намного лучше переосмыслить вашу архитектуру.

Люди не склонны использовать 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, и мешок свойств params - более четкий способ сделать это. Или, как в приведенном ниже примере, просто сделайте свой первый параметр, а затем перечислите или флаг какого-то типа. Вместо того, чтобы пропустить пустой, просто сделайте это 0

Вот ответ SO о том, как это сделать. Может ли метод С# вернуть метод?

Поэтому в вашем примере вы можете сделать это

public Func<ParamType,int> YourMethodName{

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню