Есть ли более эффективный способ запуска значений перечисления через оператор switch-case в C #, чем этот? - PullRequest
4 голосов
/ 30 марта 2010

Мне было интересно, существует ли более эффективный (эффективный, как в более простом / понятном коде) способ создания выражения case, как показано ниже ...

У меня есть словарь. Его тип ключа - Enum, а тип значения - bool. Если логическое значение истинно, я хочу изменить цвет метки на форме.

Для примера были изменены имена переменных.

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 ]

7 голосов
/ 30 марта 2010

Вы можете просто переключить метку, а затем установить цвета после оператора 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;
2 голосов
/ 30 марта 2010

Создайте карту между перечислением и меткой, которую необходимо изменить на основе этого значения перечисления. Затем используйте текущее значение перечисления, чтобы получить соответствующую метку для обновления.

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;
} 
2 голосов
/ 30 марта 2010

Создайте хеш-таблицу, которая сопоставляет ваши значения перечисления с меткой. Тогда вы можете просто посмотреть ярлык, чтобы изменить, а не переключаться.

1 голос
/ 30 марта 2010

Во-первых, вы можете объединить тело операторов case в функцию, которая принимает один или несколько параметров. Это может быть проще, чем дублирование контента. @ Идея Рида по выбору правильного экземпляра метки в операторе 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;
}
0 голосов
/ 30 марта 2010

Вы можете просто поместить свои дела в словарь:

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