Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将switch语句重构为enum_C#_Enums - Fatal编程技术网

C# 将switch语句重构为enum

C# 将switch语句重构为enum,c#,enums,C#,Enums,我想清理我的代码,使它更简单。现在我有了一个返回和int值的方法 private int ReturnMyValue(string line) { switch (line) { case "ST": return 1; case "KG": return 2; case "M": return 3; case "M2":

我想清理我的代码,使它更简单。现在我有了一个返回和int值的方法

private int ReturnMyValue(string line)
{
    switch (line)
    {
        case "ST":
            return 1;
        case "KG":
            return 2;
        case "M":
            return 3;
        case "M2":
            return 4;
        (...)
    }
}
在此之前,我从一个文件中读取了一个字符串数组,所以看起来像这样:

var myString = "";
var splittedString = myString.Split('|');
var iWantThatValue = ReturnMyValue(splitted[0]); 
private enum Value
{
    ST = 1,
    KG = 2
}
有没有一种方法可以创建这样的枚举:

var myString = "";
var splittedString = myString.Split('|');
var iWantThatValue = ReturnMyValue(splitted[0]); 
private enum Value
{
    ST = 1,
    KG = 2
}
以某种方式摆脱这种方法

splited[0]
等于“ST”时,我希望我的
I希望该值
为1

使用Enum.TryParse

if(Enum.TryParse(拆分[0],out-var-iWantThatValue)){…}
使用Enum.TryParse

if(Enum.TryParse(拆分[0],out-var-iWantThatValue)){…}

我不确定Enum是否是这里的正确工具。枚举数是编译时常量。如果您想要在运行时不会更改的内容,readonly是另一个选项。我的意思是,如果您需要对这些(用户输入)字符串进行本地化,该怎么办?如果希望在每次加载时更改可能的值,该怎么办?枚举数不能支持这一点

通常我更喜欢用集合替换switch/case语句。对于您的特定情况,字符串[]就足够了:您使用行作为值,使用返回值作为索引。但是你可以更喜欢字典之类的东西


您的案例很难确定,因为我们不知道周围的需求。

我不确定Enum是否是这里的正确工具。枚举数是编译时常量。如果您想要在运行时不会更改的内容,readonly是另一个选项。我的意思是,如果您需要对这些(用户输入)字符串进行本地化,该怎么办?如果希望在每次加载时更改可能的值,该怎么办?枚举数不能支持这一点

通常我更喜欢用集合替换switch/case语句。对于您的特定情况,字符串[]就足够了:您使用行作为值,使用返回值作为索引。但是你可以更喜欢字典之类的东西


您的案例很难确定,因为我们不知道周围的要求。

您可以将字符串解析为枚举,例如

public enum Value
{
    ST = 1, // start at 1
    KG,
    M,
    M2
}

var value = (Value)Enum.Parse(typeof(Value), "KG");
要得到整数值

var intValue = (int)val;

您可以将字符串解析为枚举,例如

public enum Value
{
    ST = 1, // start at 1
    KG,
    M,
    M2
}

var value = (Value)Enum.Parse(typeof(Value), "KG");
要得到整数值

var intValue = (int)val;

可以使用convert.ToInt32将枚举转换为Int

例如:


可以使用convert.ToInt32将枚举转换为Int

例如:


您的方法可以归结为:

private int ReturnMyValue(string line)
{
    return intValue.ContainsKey(line)
        ? intValue[line]
        : -1; //Or any other default value
}
通过使用字典/哈希映射

将开关案例转换为
intValue
映射中的条目:

{
    {"ST", 1},
    {"KG", 2},
    .
    .
}

您的方法可以归结为:

private int ReturnMyValue(string line)
{
    return intValue.ContainsKey(line)
        ? intValue[line]
        : -1; //Or any other default value
}
通过使用字典/哈希映射

将开关案例转换为
intValue
映射中的条目:

{
    {"ST", 1},
    {"KG", 2},
    .
    .
}

如果您可以稍微更改一下设计,Enum.Parse可能是一个很好的解决方案

  • 将枚举更改为
    [Flags]
    枚举,其值为二次幂(
    0x01
    0x02
    0x04
    ,等等)
  • 将字符串从使用管道字符(
    |
    )更改为使用逗号(
  • 代码最终是:

    [Flags]
    public enum Value
    {
        ST = 0x01,
        KG = 0x02,
        M = 0x04,
        M2 = 0x08,
        //etc
    }
    
    然后:

        const string valueChoices = "ST,M2";
        Value values = (Value) Enum.Parse(typeof(Value), valueChoices);
        Debug.WriteLine(values);
    

    如果您查看上面的
    值的值,它将是
    ST | M2
    ,或者,作为int:
    9
    。如果您查看输出窗口,您将看到:
    ST,M2

    如果您可以稍微更改一下设计,Enum.Parse可能是一个很好的解决方案

  • 将枚举更改为
    [Flags]
    枚举,其值为二次幂(
    0x01
    0x02
    0x04
    ,等等)
  • 将字符串从使用管道字符(
    |
    )更改为使用逗号(
  • 代码最终是:

    [Flags]
    public enum Value
    {
        ST = 0x01,
        KG = 0x02,
        M = 0x04,
        M2 = 0x08,
        //etc
    }
    
    然后:

        const string valueChoices = "ST,M2";
        Value values = (Value) Enum.Parse(typeof(Value), valueChoices);
        Debug.WriteLine(values);
    

    如果您查看上面的
    值的值,它将是
    ST | M2
    ,或者,作为int:
    9
    。如果在输出窗口中查看,您将看到:
    ST,M2

    这看起来像是一个
    字典的作业,而不是枚举。
    enum.Parse
    ,然后强制转换为
    int
    。但最好使用地图(字典)。看,这看起来像是一个
    字典的作业,而不是枚举。
    enum.Parse
    ,然后强制转换为
    int
    。但最好使用地图(字典)。参见