是否有更有效的方法通过C#中的switch-case语句运行枚举值而不是这个?

时间:2010-03-30 16:43:24

标签: c# performance switch-statement

我想知道是否有更高效(更简单/更简洁的代码)的方式来制作如下所示的案例陈述......

我有一本字典。它的关键类型是Enum,它的值类型是bool。如果布尔值为true,我想更改表单上标签的颜色。

示例中更改了变量名称。

Dictionary<String, CustomType> testDict = new Dictionary<String, CustomType>();

//populate testDict here...

Dictionary<MyEnum, bool> enumInfo = testDict[someString].GetEnumInfo(); 
//GetEnumInfo is a function that iterates through a Dictionary<String, CustomType>
//and returns a Dictionary<MyEnum, bool>

            foreach (KeyValuePair<MyEnum, bool> kvp in enumInfo)
            {
                switch (kvp.Key)
                {
                    case MyEnum.Enum1:
                        if (someDictionary[kvp.Key] == true)
                        {
                            Label1.ForeColor = Color.LimeGreen;
                        }
                        else
                        {
                            Label1.ForeColor = Color.Red;
                        }
                        break;
                    case MyEnum.Enum2:
                       if (someDictionary[kvp.Key] == true)
                        {
                            Label2.ForeColor = Color.LimeGreen;
                        }
                        else
                        {
                            Label2.ForeColor = Color.Red;
                        }
                        break;
               }
           }

到目前为止,MyEnum有8个不同的值..这意味着我有8个不同的case语句。 我知道必须有一种更简单的方法来做到这一点,我无法在脑海中概念化它。

如果有人可以提供帮助,我会非常感激。我喜欢C#而且我每天都在学习新东西......我像海绵一样吸收它:)

-CP

5 个答案:

答案 0 :(得分:7)

您可以切换标签,然后在switch语句后设置颜色:

Label label = null;
switch (kvp.Key)
{
    case MyEnum.Enum1:
        label = Label1;
        break;
    case MyEnum.Enum2:
        label = Label2;
        break;
}

label.ForeColor = kvp.Value ? Color.LimeGreen : Color.Red;

或者,您可以拥有Dictionary<MyEnum, Label>,并且只需恰当地查找标签:

labelDictionary[kvp.Key].ForeColor = kvp.Value ? Color.LimeGreen : Color.Red;

答案 1 :(得分:2)

创建一个哈希表,从您的枚举值映射到标签。然后你可以查找标签来改变,而不是切换。

答案 2 :(得分:2)

在枚举和需要根据该枚举值更改的标签之间创建一个映射。然后使用当前的枚举值来获取要更新的相应标签。

Dictionary<MyEnum,Label> labelMap = new Dictionary<MyEnum,Label>();
labelMap.Add( MyEnum.Enum1, Label1 );
...


foreach (KeyValuePair<MyEnum, bool> kvp in enumInfo)  
{  
    var label = labelMap[kvp.Key];
    label.ForeColor = kvp.Value ? Color.LimeGreen : Color.Red;
} 

答案 3 :(得分:1)

首先,您可能希望将case语句的主体合并到一个接受一个或多个参数的函数中。这可能比复制内容更容易。 @Reed在switch语句中选择正确的标签实例的想法也是一个好主意,如果逻辑只在此基础上变化,那么这是一个更好的选择。

您还可以使用?:运算符来简化决策逻辑。

例如:

switch (kvp.Key) 
            { 
                case MyEnum.Enum1: 
                    UpdateUI( Label1, someDictionary[kvp.Key] );
                    break; 
                case MyEnum.Enum2: 
                    UpdateUI( Label2, someDictionary[kvp.Key] );
                    break; 
                case MyEnum.Enum3: 
                    UpdateUI( Label3, someDictionary[kvp.Key] );
                    break; 
            }

public void UpdateUI( Label theLabel, bool whichOne )
{
     theLabel.ForeColor = whichOne ? Color.LimeGreen : Color.Red;
}

答案 4 :(得分:0)

您可以将案例放在字典中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace ConsoleApplication3
{
class Program
{
    private enum MyEnum
    {
        shwan,
        dooo,
        sieven,
        sieven_haif,
        shwenty,
        shwenty_doo_haif,
        schfifty_faive
    }

    class EnumInfo
    {
        public MyEnum Enum;
        public bool State;

        public override bool  Equals(object obj)
        {
            EnumInfo ei = obj as EnumInfo;
            return this.Enum == ei.Enum && this.State == ei.State;
        }

        public override int GetHashCode()
        {
            return this.Enum.GetHashCode() ^ this.State.GetHashCode();
        }
    }

    private static IDictionary<EnumInfo, Color> EnumColorDict = new Dictionary<EnumInfo, Color>()
        {
            {new EnumInfo(){Enum=MyEnum.shwan, State=true},Color.LimeGreen},
            {new EnumInfo(){Enum=MyEnum.shwan, State=false},Color.Red},
            {new EnumInfo(){Enum=MyEnum.dooo, State=true},Color.LimeGreen},
            {new EnumInfo(){Enum=MyEnum.dooo, State=false},Color.Red}
        };

    static void Main(string[] args)
    {
        EnumInfo ei = new EnumInfo() { Enum = MyEnum.shwan, State = true };

        Color c = EnumColorDict[ei];
    }
}
}