4

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

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

5 回答 5

5

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

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

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

但是,看起来您的设计可能需要一些返工。拥有所有这些单独的布尔值是笨拙的。

于 2013-05-21T05:30:57.990 回答
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 的映射。我通过单元测试来做到这一点,但如果 GetString 在 Postfix 扩展方法中返回 null,则很容易放置断言或抛出异常。

于 2013-05-21T05:48:59.073 回答
2

switch does not support this. The cases must be constant. The cases must also be unique.

You need to either turn your boolean properties into an enum and switch off of that or change your switch into a standard if statement

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

于 2013-05-21T05:29:11.780 回答
2

您可以使用 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

于 2020-07-02T01:15:01.170 回答
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;
}
于 2018-11-28T16:19:14.583 回答