在C#上具有多个条件的switch语句

时间:2015-05-22 07:15:09

标签: c#

您能否告诉我如何将switch与下面提到的代码段一起使用?

if (IsSelectedOrganizer)
{
   //
}
else if (IsNewOrganizer && IsOrganizerUserAlreadyExist)
{
  //
}
else if (IsNewOrganizer && !IsOrganizerUserAlreadyExist)
{
    //
}
else
{
   //
}

但在Javascript我们可以执行此操作,如下所示。但C#它不允许?它说A constant value is expected

                  switch (true) {
                        case IsSelectedOrganizer:
                            //
                            break;
                        case IsNewOrganizer && IsOrganizerUserAlreadyExist:
                            //
                            break;
                        case IsNewOrganizer && !IsOrganizerUserAlreadyExist:
                            //
                            break;
                    } 

6 个答案:

答案 0 :(得分:7)

if不是switch的完美用例,所以我建议保留它。但你可以稍微改进一下:

if (IsSelectedOrganizer)
{
    //
}
else if (IsNewOrganizer)
{
    if (IsOrganizerUserAlreadyExist)
    {
        //
    }
    else
    {
        //
    }
}
else
{
    //
}

答案 1 :(得分:3)

switch语句不能像if/else那样具有多个条件,这是因为switch通常实现为快速程序中哈希表,这意味着:1)所有比较值必须是const,并且2)它实际上没有与switch case表达式一样多的比较。

有一个"解决方法"这需要将布尔表达式转换为自定义enum值,然后转换为switching,但我不知道在这种情况下如何提供任何帮助。

答案 2 :(得分:1)

这不是switch语句的理想选择,因为你的逻辑取决于几个变量的值,而不是检查单个变量的不同值。

以下是一种易于转换为switch语句的代码示例:

if (value == 0)
{
    // do stuff
}
else if (value == 1)
{
    // etc
}

作为switch语句:

switch (value)
{
    case 0:
        // do stuff
        break;
    case 1:
        // etc
        break;
}

如果您正在检查不同变量的组合,那么使用if ... else if语句并没有错。如果由于某种原因你必须使用switch语句,最好的解决方案是创建一个enum,其值代表你可能的每个状态,然后打开它。例如:

enum OrganizerType
{
    SelectedOrganizer,
    NewOrganizerUserExists,
    NewOrganizerUserDoesntExist
}

// ...

OrganizerType orgType = calculateOrgType();

switch (orgType)
{
    case SelectedOrganizer:
        // do stuff
        break;
    // etc
}

答案 3 :(得分:0)

作为一项运动纯粹是"可以做到吗?",这是一个解决方案。任何开发人员都不应该考虑在现实生活中使用它:

var switchValue = IsSelectedOrganizer ? 4 : 0 +
                  IsNewOrganizer ? 2 : 0 +
                  IsOrganizerUserAlreadyExist ? 1 : 0;

switch (switchValue)
{
    case 7:
    case 6:
    case 5:
    case 4:
        // IsSelectedOrganizer part
        break;
    case 3:
        // IsNewOrganizer && IsOrganizerUserAlreadyExist part
        break;
    case 2:
        // IsNewOrganizer && !IsOrganizerUserAlreadyExist part
        break;
    default:
        // else part
}

答案 4 :(得分:-1)

public int FlagValues
{
    return (IsSelectedOrganizer & 1) + (IsNewOrganizer & 2) + (IsOrganizerUserAlreadyExists & 4)
}

switch (FlagValues)

答案 5 :(得分:-1)

无论比使用if更好,还是使用switch s实现; - )。

switch (IsSelectedOrganizer)
{
    case true:
    {
        //
    }
    break;
    default:
    {
        switch (IsNewOrganizer)
        {
            case true:
            {
                switch ((IsOrganizerUserAlreadyExist))
                {
                    case true:
                    {
                        //
                    }
                    break;
                    default:
                    {
                        //  
                    }
                    break;
                }

            }
            break;
            default:
            {
                //
            }
            break;
        }
    }
    break;
}