将switch语句重构为枚举

时间:2018-10-16 14:39:03

标签: c# enums

我想清理代码并使代码更简单。现在,我有一个返回和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
}

并以某种方式摆脱该方法?

iWantThatValue等于“ ST”时,我希望我的splitted[0]为1。

6 个答案:

答案 0 :(得分:3)

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

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

var value = (Value)Enum.Parse(typeof(Value), "KG");

并获取整数值...

var intValue = (int)val;

答案 1 :(得分:1)

答案 2 :(得分:0)

我不确定枚举是否是正确的工具。枚举器是编译时间常数。如果您希望某些内容在运行时不会更改,则只读是另一种选择。我的意思是,如果您需要对那些(用户输入)字符串进行本地化怎么办?如果您希望在每次加载时更改可能的值怎么办?枚举器不支持。

通常,我更喜欢将Collection替换为switch / case语句。对于您的特定情况,使用string []就足够了:您将行用作值,将返回值用作Index。但是您可以通过使用Dictionary或类似的工具来获得更高的成就。

您的情况很糟糕,因为我们不知道周围的要求。

答案 3 :(得分:0)

您可以使用Convert.ToInt32从枚举转换为Int

示例:https://rextester.com/ETB25701

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //Your code goes here
            Console.WriteLine(Convert.ToInt32(Value.ST));
        }

    }

    public enum Value
    {
        ST = 1,
        KG = 2
    }
}

答案 4 :(得分:0)

您的方法可以归结为:

private int ReturnMyValue(string line)
{
    return intValue.ContainsKey(line)
        ? intValue[line]
        : -1; //Or any other default value
}

通过使用Dictionary / HashMap。

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

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

答案 5 :(得分:0)

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

  1. 将您的枚举更改为[Flags]枚举,其值应为2的幂(0x010x020x04等)。
  2. 将字符串从使用竖线字符(|)更改为使用逗号(,

代码最终是:

[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);

如果您在上方查看values的值,它将是ST | M2,或者作为一个整数:9。如果您在“输出”窗口中查看,则会看到:ST, M2