可以用更好的方式来完成吗?
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;然后编译器将报告错误。(很有可能)
那么有没有其他方法呢?(我不能改变switch语句)
使用C#3.0
谢谢
发布于 2010-05-08 16:10:26
您可以将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)以确保映射存在。
发布于 2010-05-08 16:08:58
使用:
public const string BETA = "beta";工作正常。按照您声明的方式,它是一个变量。case表达式中不允许使用变量。通过使用const关键字,您告诉编译器它实际上是一个常量,正如您的类名所暗示的那样。
您所说的“我不能更改switch语句”是什么意思?如果有足够多的可能性,我会考虑使用字典。请注意,这主要是为了可读性和可维护性,而不是性能。例如,使用字典可以更容易地进行反向转换,因为您可以从相同的数据构造反向字典。
使用字典,它看起来像这样:
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);发布于 2010-05-08 16:09:46
switch中使用的字符串必须是常量,因此如果您声明常量而不是变量,则可以在switch中使用它:
public const string BETA = "beta";如果您不想让字符串保持不变,以便在程序运行时可以更改它们,则不能使用开关。然后,您可以使用Dictionary<string, EnumFactorType>来查找这些值,以获得与开关类似的性能。
https://stackoverflow.com/questions/2793360
复制相似问题