C# 3.0 有没有其他方法来编写这个switch语句(C#3.0)

C# 3.0 有没有其他方法来编写这个switch语句(C#3.0),c#-3.0,C# 3.0,可以用更好的方式吗 public static EnumFactorType GetFactorEnum(string str) { Standardization e = new Standardization(); switch (str.ToLower()) { case "beta": e.FactorType = EnumFac

可以用更好的方式吗

public static EnumFactorType GetFactorEnum(string str)
        {
            Standardization e = new Standardization();
            switch (str.ToLower())
            {
                case "beta":
                    e.FactorType = EnumFactorType.BETA;
                    break;
                case "bkp":
                    e.FactorType = EnumFactorType.BOOK_TO_PRICE;
                    break;
                case "yld":
                    e.FactorType = EnumFactorType.DIVIDEND_YIELD;
                    break;
                case "growth":
                    e.FactorType = EnumFactorType.GROWTH;
                    break;
                case "mean":
                    e.FactorType = EnumFactorType.MARKET_CAP;
                    break;
                case "momentum":
                    e.FactorType = EnumFactorType.MOMENTUM;
                    break;
                case "size":
                    e.FactorType = EnumFactorType.SIZE;
                    break;
                case "stat_fact1":
                    e.FactorType = EnumFactorType.STAT_FACT_1;
                    break;
                case "stat_fact2":
                    e.FactorType = EnumFactorType.STAT_FACT_2;
                    break;
                case "value":
                    e.FactorType = EnumFactorType.VALUE;
                    break;
            }
            return e.FactorType;
        }
如果我创建一个静态类(比如Constatant)并声明变量

public static string BETA= "beta";
然后如果我试着把它放在下面的表达式中

Case Constants.BETA : e.FactorType = EnumFactorType.BETA;
                        break;
然后编译器将报告错误。(完全可以预料)

那么还有其他方法吗?(我不能更改switch语句)

使用C#3.0

谢谢

使用:

public const string BETA = "beta";
很好。按照您声明它的方式,它是一个变量。
大小写
表达式中不允许使用变量。通过使用
const
关键字,您告诉编译器它实际上是一个常量,正如您的类名所示

你说的“我不能改变开关语句”是什么意思?有足够多的可能性,我会考虑使用字典。请注意,这主要是为了可读性和可维护性,而不是性能。例如,使用字典可以更容易地进行反向转换,因为您可以从相同的数据构造反向字典

使用字典,它看起来像这样:

private static readonly Dictionary<string, EnumFactorType> _factorTypeMap =
new Dictionary<string, EnumFactorType>(StringComparer.InvariantCultureIgnoreCase)
{
    { "beta", EnumFactorType.BETA },
    { "bkp", EnumFactorType.BOOK_TO_PRICE },
    // etc. You can still use strings constants here instead of literals.
};
如果确定该值存在,则更简单:

 e.FactorType = _factorTypeMap[str];
创建反向词典是一行,在这里显示为两行:)

Dictionary\u factorTypeReverseMap=
_factorTypeMap.ToDictionary(kvp=>kvp.Value,kvp=>kvp.Key);
使用:

很好。按照您声明它的方式,它是一个变量。
大小写
表达式中不允许使用变量。通过使用
const
关键字,您告诉编译器它实际上是一个常量,正如您的类名所示

你说的“我不能改变开关语句”是什么意思?有足够多的可能性,我会考虑使用字典。请注意,这主要是为了可读性和可维护性,而不是性能。例如,使用字典可以更容易地进行反向转换,因为您可以从相同的数据构造反向字典

使用字典,它看起来像这样:

private static readonly Dictionary<string, EnumFactorType> _factorTypeMap =
new Dictionary<string, EnumFactorType>(StringComparer.InvariantCultureIgnoreCase)
{
    { "beta", EnumFactorType.BETA },
    { "bkp", EnumFactorType.BOOK_TO_PRICE },
    // etc. You can still use strings constants here instead of literals.
};
如果确定该值存在,则更简单:

 e.FactorType = _factorTypeMap[str];
创建反向词典是一行,在这里显示为两行:)

Dictionary\u factorTypeReverseMap=
_factorTypeMap.ToDictionary(kvp=>kvp.Value,kvp=>kvp.Key);

开关中使用的字符串必须是常量,因此如果声明常量而不是变量,则可以在开关中使用它:

public const string BETA = "beta";

如果不希望字符串保持不变,以便在程序运行时更改字符串,则不能使用开关。然后,您可以使用
字典
查找值,以获得与开关类似的性能。

开关中使用的字符串必须是常量,因此如果您声明常量而不是变量,则可以在开关中使用它:

public const string BETA = "beta";

如果不希望字符串保持不变,以便在程序运行时更改字符串,则不能使用开关。然后您可以使用
字典
查找值,以获得与开关类似的性能。

您可以将
字典
定义为“映射”,并使用它。它本质上是相同的逻辑,但可读性更强

首先,映射对象:

private Dictionary<string, EnumFactorType> _mapping = new Dictionary<string, EnumFactorType>
{
    { "beta", EnumFactorType.BETA },
    { "bkp", EnumFactorType.BOOK_TO_PRICE },
    // etc
}

您可能需要首先调用_mapping.ContainsKey(str)以确保映射存在。

您可以将
字典定义为“映射”,然后使用它。它本质上是相同的逻辑,但可读性更强

首先,映射对象:

private Dictionary<string, EnumFactorType> _mapping = new Dictionary<string, EnumFactorType>
{
    { "beta", EnumFactorType.BETA },
    { "bkp", EnumFactorType.BOOK_TO_PRICE },
    // etc
}

您可能需要首先调用_mapping.ContainsKey(str)以确保映射存在。

如果可以更改
switch
语句,请使用
Enum.Parse
@KennyTM:但是,开关中的某些字符串与枚举中的名称不对应。如果可以更改
switch
语句,使用
Enum.Parse
@KennyTM:但是,开关中的某些字符串与枚举中的名称不对应。如果需要确保映射存在,请使用
TryGetValue
方法。否则,您将执行两个相同的查找。不过,您可能希望使该映射成为静态的;如果需要确保映射存在,请使用
TryGetValue
方法,而不是为每个实例生成一个映射。否则,您将执行两个相同的查找。不过,您可能希望使该映射成为静态的;您不会希望为每个实例生成一个实例,是吗?如果编译器将其设置为常量,那么按照上面提到的方式执行此操作是没有意义的。我们不需要做一个常量,因为我们没有重用这个值。@LCarter:当然这是毫无意义的,但它回答了这个问题。当编译器把它做为常量时,按照上面提到的那样做是没有意义的。我们不需要创建常量,因为我们没有重用这个值。@LCarter:当然这是毫无意义的,但它回答了问题。