用布尔值切换案例

时间:2013-05-21 05:20:27

标签: c#

我正在尝试为项目创建前缀文本值。我正在使用开关盒。当用户选择相关的单选按钮时,我们应该给出前缀值。

在“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;
     }

5 个答案:

答案 0 :(得分:5)

这不是switch的工作方式。你不能在每个case中放置一个任意的布尔表达式(假设你的意思是==而不是=,顺便说一句。)

您需要使用一组if-else块,例如:

if (SheetMgrForm.Goldcoast) {
    postfix = "QLD";
} else if (SheetMgrForm.Melbourne) {
    postfix = "MEL";
} else if ......

然而,看起来您的设计可能会使用一些返工。拥有所有这些单独的布尔是笨拙的。

答案 1 :(得分:3)

另一种方法是使用枚举来定义您的区域,然后将这些区域映射到资源文件。这使得它更易于维护,例如未来的本地化或进一步扩展,如果列表很长,可能很有用,即通过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的映射。我通过单元测试来做到这一点,但是如果GetIntring在Postfix扩展方法中返回null,则很容易放置Assert或抛出异常。

答案 2 :(得分:2)

switch不支持此功能。案件必须是不变的。案件也必须是独一无二的。

您需要将布尔属性转换为enum并关闭该属性或将您的开关更改为标准if语句

http://msdn.microsoft.com/en-us/library/06tc147t(v=vs.110).aspx

答案 3 :(得分:1)

您可以使用C#8中的属性模式来做到这一点:

string officePostfix(SheetMgrForm test) => 
    test switch
    {
        { GoldCoast: true } => "QLD",
        { Melbourne: true } => "VIC",
        { Sydney: true } => "NSW",
        { Brisbane: true } => "BIS",
        _ => string.Empty
    };

https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8#property-patterns

答案 4 :(得分:0)

这可能会返回您想要的结果,但这有点丑陋。案例部分期望某种恒定值。在这种情况下,您将具有“ 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;
}