Преобразование жестко запрограммированного оператора switch в динамически загружаемый поиск «многие ключи - одно значение» - PullRequest
1 голос
/ 27 мая 2010

Что такое хорошая коллекция / контейнер, который можно использовать для хранения содержимого оператора switch в нескольких аварийных ситуациях? Я думаю, более точный способ, что такое хорошее решение C # для поиска "много ключей одно значение"? Я проверил пространство имен System.Collections и связанные с ним пространства имен, но не нашел ничего, что особенно ограничивало бы многие ключи-одно-значение.

Недавно я написал небольшую консольную программу для создания и проверки файлов XML, необходимых для моего веб-приложения, чтобы избежать ошибок, возникающих при его написании вручную. Но для первоначальной версии я жестко закодировал несколько элементов, которые немного изменчивы - в частности, несколько словарей для проверки и один большой оператор-переключатель, который имеет огромный набор опций. Хотя это будет работать в течение нескольких месяцев, возможно, в конечном итоге потребуется обновить эти жестко запрограммированные элементы, что в настоящее время потребует редактирования исходного файла. Чтобы избежать этого, я решил, что я буду хранить информацию о словарях и операторах переключения в файле XML (который в конечном итоге превратился в ужасно рекурсивную тенденцию в создание программы для построения и проверки этих XML файлы для меня). Теперь, сохраняя это в файле, когда я получаю данные, я не могу просто перестроить оператор switch так, как я могу использовать словари. Поэтому мне просто нужно смоделировать эффект оператора switch, что в основном означает, что мне нужно несколько «ключей» для ссылки на одно и то же «значение».


Пример фрагмента из оператора switch. Этот метод преобразует входные данные специальных значений в соответствующий идентификатор, в основном для экономии места в памяти человека, пытаясь запомнить значения. Как показано на рисунке, я бы хотел, чтобы в контейнере хранились несколько ключей, каждый из которых выдает одно значение.

    private static string DiscernRegistrationId(string str)
{
    string retVal = str;
    switch (str.ToLowerKey()) //shortcut extension for str.Replace(" ","").Replace(".","").ToLowerInvariant()
    {
        case "computerpackage":
        case "comppackage":
        case "cpackage":
        case "computerpkg":
        case "comppkg":
        case "cpkg":
            retVal = "0x0100C73692D109C741A1B8846141B47519C8";
            break;
        case "mobilepackage":
        case "mobpackage":
        case "mpackage":
        case "mobilepkg":
        case "mobpkg":
        case "mpkg":
            retVal = "0x010081F753F0A4A5412CB6A8E9F8CD193F58";
            break;
        //More cases follow
    }
    return retVal;
}

Ответы [ 2 ]

3 голосов
/ 27 мая 2010

Я бы использовал обычный Dictionary<string, string> и указал бы все случайные случаи на один и тот же string объект.

1 голос
/ 27 мая 2010

Я думаю, что ваш лучший вариант - придерживаться одного из встроенных IDictionary<> классов и просто дублировать значения. Я бы на самом деле рекомендовал SortedDictionary<> в этом случае, так как он хранит элементы в порядке по ключу. Это было бы полезно, если бы вам нужно было распечатать ключи так, чтобы они выглядели так же, как оператор switch.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...