能否以更好的方式完成
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
由于
答案 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>
查找值以获得与切换类似的性能。