Словарь с делегатом или переключателем? - PullRequest
22 голосов
/ 24 мая 2010

Я пишу парсер, который вызывает некоторые функции, зависящие от некоторого значения.

Я могу реализовать эту логику с помощью простого переключателя следующим образом:

switch(some_val)   
{   
    case 0:   
        func0();   
        break;   
    case 1:   
        func1();   
        break;   
}     

или с делегатами и словарем, подобным этому:

delegate void some_delegate();   
Dictionary<int, some_delegate> some_dictionary = new Dictionary<int, some_delegate>();   
some_dictionary[0] = func0;   
some_dictionary[1] = func1;   

some_dictionary[some_value].Invoke();    

Являются ли эти два метода эквивалентными и какие предпочтительнее?

Ответы [ 6 ]

11 голосов
/ 24 мая 2010

Я настоятельно предпочитаю выбор словаря, потому что с инициализатором он может быть намного более компактным и читаемым:

var actions = new Dictionary<int, Action>
{
  {1, () => Console.WriteLine("One!")},
  {2, () => Console.WriteLine("Two!")}
}

Кроме того, у вас есть больше гибкости; Вы можете добавлять условия и действия программно, что часто удобно, в зависимости от того, что вы делаете.

9 голосов
/ 24 мая 2010

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

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

7 голосов
/ 24 мая 2010

Если типичный программист в вашей команде похож на тех, с кем я часто сталкиваюсь, вам следует выбрать самый простой вариант, т. Е. Переключение. Делегаты кажутся мне «умным» решением, которое не нужно.

4 голосов
/ 19 апреля 2012

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

Однажды у меня была ситуация, когда мне нужно было динамически создать оператор switch. Этот метод предоставил намного более удобочитаемое решение.

2 голосов
/ 24 мая 2010

Оба делают одно и то же (хорошо, вы должны проверить, появляется ли ключ в диктонаре).

Это просто вопрос читабельности. Что выглядит лучше всего для вас и что более важно, что предпочитают люди, читающие ваш код.

(думаю, словарь)

0 голосов
/ 14 июня 2011

Если вам нужно включить строки в файле ресурсов, скажем, для целей глобализации, то вам нужно будет использовать словарь / делегатский подход.

...