是否有任何替代方法来编写此switch语句(C#3.0)

时间:2010-05-08 08:02:39

标签: c#-3.0

能否以更好的方式完成

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表达式中,如

Case Constants.BETA : e.FactorType = EnumFactorType.BETA;
                        break;

然后编译器将报告错误。(非常期待)

那么还有其他方法吗?(我可以改变开关语句)

使用C#3.0

由于

3 个答案:

答案 0 :(得分:7)

您可以将Dictionary<string, EnumFactorType>定义为“映射”,然后使用它。它本质上是相同的逻辑,但可以更具可读性。

首先,映射对象:

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

然后在你的方法中:

e.FactorType = _mapping[str.ToLower()];

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

答案 1 :(得分:3)

使用:

public const string BETA = "beta";

工作正常。你声明它的方式,它是一个变量。 case表达式中不允许使用变量。通过使用const关键字,您告诉编译器它实际上是一个常量,正如您的类名所示。

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

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

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.
};

然后在你的方法中:

EnumFactorType factorType;
if (_factorTypeMap.TryGetValue(str, out factorType))
{
    e.FactorType = factorType;
}
else
{
    throw new Exception("Unexpected value, bla bla");
}

如果您确定该值存在,则更简单:

 e.FactorType = _factorTypeMap[str];

创建反向字典是一行的,在这里显示为两行:)

Dictionary<EnumFactorType, string> _factorTypeReverseMap =
    _factorTypeMap.ToDictionary(kvp => kvp.Value, kvp => kvp.Key);

答案 2 :(得分:1)

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

public const string BETA = "beta";

如果您不希望字符串保持不变,以便在程序运行时可以更改它们,则无法使用开关。然后,您可以使用Dictionary<string, EnumFactorType>查找值以获得与切换类似的性能。