使用布尔值的switch case

4

我正在尝试为一个项目创建前缀文本值。我使用switch case来实现。当用户选择相关的单选按钮时,我们应该给出相应的前缀值。

"switch()"后面应该放什么?

来自用户选择的值是布尔值。输出是字符串。

需要帮助...

 public string officePostfix()
  {
   string postfix = null;
     switch (...)
        {
            case SheetMgrForm.Goldcoast = true:
                postfix = "QLD";
                break;
            case SheetMgrForm.Melbourne = true:
                postfix = "MEL";
                break;
            case SheetMgrForm.Sydney = true:
                postfix = "SYD";
                break;
            case SheetMgrForm.Brisbane = true:
                postfix = "BIS";
                break;
        }
        return postfix;
     }

10
我认为你的设计是不正确的。你应该使用一个“区域”枚举或类似的东西(这个东西可以是来自数据库的ID,或者是用于识别条目的简短代码),而不是为每个区域使用布尔字段。 - Adriaan Stander
进一步说,这种事情看起来应该使用字典来完成... - Aron
为什么不直接使用if和else语句呢? - fhnaseer
5个回答

5
这并不是switch的工作方式。你不能在每个case中放入任意布尔表达式(顺便说一下,假设你的意思是==而不是=)。
你需要使用一组if-else块,例如:
if (SheetMgrForm.Goldcoast) {
    postfix = "QLD";
} else if (SheetMgrForm.Melbourne) {
    postfix = "MEL";
} else if ......

然而,看起来你的设计需要进行一些改进。拥有所有这些单独的布尔值是笨拙的。

1
虽然这样做可以工作,但我无法表达我的不满,因为有很多程序员坚持使用 if-else-if-else-if-else-... 结构,而完全可以使用良好的可枚举类型或更合适的映射。 - cyborg

4
另一种方法是使用枚举定义您的区域,然后将其映射到资源文件。这使得它更易于维护,例如本地化或将来的扩展,并且如果列表很长,即通过T4自动创建枚举和资源,或者必须查询Web服务等,则可能会很有用...
例如,假设您有一个AreaPostfixes资源文件和一个Area枚举。
public enum Area
{
     Goldcoast,
     Melbourne,
     // ...
}

public static class AreaExtensions
{  
    public static string Postfix(this Area area)
    {
        return AreaPostfixes.ResourceManager.GetString(area.ToString());
    }
}

// AreaPostfixes.resx
Name       Value
Goldcoast  QLD
Melbourne  MEL

// Usage
public string GetPostfix(Area area)
{
    return area.Postfix();
}

这消除了任何开关等的需求,唯一需要确保的是每个枚举和资源都有1:1的映射。我通过单元测试来实现这一点,但很容易通过在后缀扩展方法中放置Assert或抛出异常来确保GetString不返回null。


3

2
请注意,无法将 switch 表达式用作语句 ~ 它们必须被分配或返回参见 - WerWet

2

0

这可能会返回您想要的结果,但它是一种有点丑陋的蛮力方法。case部分期望某种常量值。在这种情况下,您将拥有"case true:"或"case false:"(尽管我不确定在这种情况下您会做什么)。

public string officePostfix()
{
    string postfix = null;
    switch (SheetMgrForm.Goldcoast == true)
    {
        case true:
            postfix = "QLD";
            break;
    }
    switch(SheetMgrForm.Melbourne == true)
    { 
        case true:
            postfix = "MEL";
            break;
    } 
    switch (SheetMgrForm.Sydney == true)
    {
        case true:
            postfix = "SYD";
            break;
    }     
    switch(SheetMgrForm.Brisbane == true)
    {
        case true:
            postfix = "BIS";
            break;
    }
        return postfix;
}

1
此时最好使用“IF”而不是“SWITCH”。 - GodIsAnAstronaut

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