Компиляторы очень хороши в оптимизации конструкций switch / case; CLR, скорее всего, превратит его в справочную таблицу или что-то аналогичное быстрое, поэтому ручная прокрутка вашей собственной версии, такой, как предлагает Хенк Холтерман, - не то, что я бы порекомендовал. CLR может выполнять лучшую работу, чем вы, при выборе лучшего алгоритма.
Если это проблема элегантности или ремонтопригодности, и у вас есть несколько переключателей / вариантов, связанных с одним и тем же классом, выполняющим аналогичные функции, то один из способов улучшить его - это инкапсулировать всю функциональность, связанную с одним «случаем», в его собственный экземпляр класса, например так:
class MyOption
{
public static readonly MyOption Alpha = new MyOption(1, 10, "Alpha Text");
public static readonly MyOption Bravo = new MyOption(2, 100, "Bravo Text");
public static readonly MyOption Charlie = new MyOption(3, 1000, "Charlie Text");
// ... Other options ...
public static readonly MyOption Default = new MyOption(0, 0, null);
public MyOption(int id, int value, string text)
{
this.ID = id;
this.Value = value;
this.Text = text;
}
public int ID { get; private set; }
public int Value { get; private set; }
public string Text { get; private set; }
}
Тогда в вашем классе / контроле / странице:
static MyOption GetOption(string optionName)
{
switch (optionName)
{
case "ALPHA":
return MyOption.Alpha;
case "BRAVO":
return MyOption.Bravo;
case "CHARLIE":
return MyOption.Charlie;
// ... Other options ...
default:
return MyOption.Default;
}
}
private MyOption GetOptionFromDropDown()
{
string optionName = GetOptionNameFromDropDown();
return GetOption(optionName);
}
private string GetOptionNameFromDropDown()
{
// ... Your code ...
}
После этого вы можете начать производить события и другие методы:
private void control1_SomeEvent(object sender, EventArgs e)
{
MyOption option = GetOptionFromDropDown();
DoSomething(option.ID);
}
private void control2_SomeEvent(object sender, EventArgs e)
{
MyOption option = GetOptionFromDropDown();
DoSomethingElse(option.Value);
}
Конечно, это полезный шаблон, если у вас есть несколько этих переключателей / вариантов, которые вы хотите преобразовать в один. Если у вас есть только один переключатель / кейс, вы просто получите код больше , поэтому оставьте его в покое!
Другие возможности улучшения обслуживания включают в себя:
- Изменение строки на тип Enum (преобразование optionName с использованием Enum.Parse);
- Перемещение всего материала MyOption / GetOption в его собственный класс (если у вас есть несколько классов / элементов управления / страниц, которые должны работать с одним и тем же набором вариантов выбора);
- Добавьте делегат метода в класс MyOption, если вам действительно нужно вызывать разные методы для каждого;
- Пусть ваш DropDownList или другой элемент управления хранят прямую ссылку на экземпляр MyOption, если это возможно.
Вот и все. Его легко написать, легко понять, его легко обслуживать, он сэкономит ваше время, если у вас много конструкций switch / case, и все же позволяет CLR выполнять наилучшую возможную оптимизацию. Единственной стоимостью является небольшой объем памяти, необходимый для хранения этих полей только для чтения.