首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有任何替代方法来编写此switch语句(C#3.0)

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

Stack Overflow用户
提问于 2010-05-08 16:02:39
回答 3查看 184关注 0票数 1

可以用更好的方式来完成吗?

代码语言:javascript
复制
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)并像这样声明变量

代码语言:javascript
复制
public static string BETA= "beta";

然后如果我试着把它放在Case表达式中,比如

代码语言:javascript
复制
Case Constants.BETA : e.FactorType = EnumFactorType.BETA;
                        break;

然后编译器将报告错误。(很有可能)

那么有没有其他方法呢?(我不能改变switch语句)

使用C#3.0

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-08 16:10:26

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

首先,映射对象:

代码语言:javascript
复制
private Dictionary<string, EnumFactorType> _mapping = new Dictionary<string, EnumFactorType>
{
    { "beta", EnumFactorType.BETA },
    { "bkp", EnumFactorType.BOOK_TO_PRICE },
    // etc
}

然后在你的方法中:

代码语言:javascript
复制
e.FactorType = _mapping[str.ToLower()];

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

票数 7
EN

Stack Overflow用户

发布于 2010-05-08 16:08:58

使用:

代码语言:javascript
复制
public const string BETA = "beta";

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

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

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

代码语言:javascript
复制
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.
};

然后在你的方法中:

代码语言:javascript
复制
EnumFactorType factorType;
if (_factorTypeMap.TryGetValue(str, out factorType))
{
    e.FactorType = factorType;
}
else
{
    throw new Exception("Unexpected value, bla bla");
}

如果你确定这个值存在,那就更简单了:

代码语言:javascript
复制
 e.FactorType = _factorTypeMap[str];

创建反向字典是一行程序,在下面的两行中显示:)

代码语言:javascript
复制
Dictionary<EnumFactorType, string> _factorTypeReverseMap =
    _factorTypeMap.ToDictionary(kvp => kvp.Value, kvp => kvp.Key);
票数 3
EN

Stack Overflow用户

发布于 2010-05-08 16:09:46

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

代码语言:javascript
复制
public const string BETA = "beta";

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2793360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档