Лучше использовать HashTable или переключать регистр

Я не уверен, какой из них лучше. Мне нужно проанализировать каждый символ входной строки и получить строку замены для символа. Для некоторых объектов разрешены все буквенно-цифровые символы, поэтому использование переключателя/регистра приведет к большому количеству кода и ухудшит читаемость и удобство сопровождения, но я могу использовать статический метод. Использование HashTable также требует большого количества кода.

Использование статического метода:

 private static string EncodeChar(char c)
    {
        var symbols = string.Empty;

        switch (c)
        {
            case '0':
                symbols = "Test";
                break;
            case '1':
                symbols = "Hello";
                break;
            [...]
        }

        symbols;
    }

Использование хеш-таблицы:

private static Hashtable table = CreateTable();

private static Hashtable CreateTable()
{
    var table = new HashTable();
    table.Add('0',"Test");
    table.Add('1', "Hello");
    [...]
    return table;
}

private static string EncodeChar(char c)
{
    return table.ContainsKey(c) ? table[c].ToString() : string.Empty;
}

Метод кодирования:

public void Encode()
{
    string output = string.Empty;

    for (int i = 1; i < Data.Length; i++)
    {
        output = string.Concat(output, EncodeChar(Data[i]));
    }

    EncodedData = output;
}

Каковы преимущества/недостатки в отношении производительности и распределения памяти?


person chaosr    schedule 14.02.2012    source источник
comment
Вам приходится выбирать между этими методами? Или вы согласны попробовать что-то еще?   -  person shahensha    schedule 14.02.2012
comment
можно и что-то другое попробовать :-)   -  person chaosr    schedule 14.02.2012
comment
Используйте Dictionary<char, string>, а не HashTable — это значительно более эффективно и менее подвержено случайным ошибкам типа.   -  person Eric Lippert    schedule 14.02.2012
comment
ты прав словарь лучше :-)   -  person chaosr    schedule 15.02.2012


Ответы (3)


Я бы использовал HashTable, потому что код более удобочитаем и удобен в сопровождении: однажды вы можете решить загрузить строки подстановки из XML-файла, чтобы не менять код для изменения сопоставлений.

person vulkanino    schedule 14.02.2012

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

например, если вы предполагаете, что все символы равны '9', то ему придется оценивать 8 if conditions перед выполнением правильного statement каждый раз, когда вы обрабатываете символ.

Это просто наихудший пример при использовании switch()

person Shai    schedule 14.02.2012
comment
Операторы switch переходят непосредственно к правильному регистру, они не проверяют каждый случай до тех пор, пока он не встретит правильный. Внутренне оператор switch фактически преобразуется в словарь, поэтому он все равно использует хеширование. - person RichK; 14.02.2012
comment
@RichK: Ситуация несколько сложнее, чем вы думаете. Иногда операторы switch преобразуются в словари, а словари в некоторых случаях могут проверять несколько элементов в корзине, прежде чем получат нужный. Операторы switch иногда компилируются в таблицы переходов, которые переходят непосредственно к правильному коду. Операторы switch иногда компилируются в серию операторов if-then. Какой метод выберет компилятор, зависит от реализации. В этом примере компилятор почти наверняка выберет таблицу переходов. - person Eric Lippert; 14.02.2012

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

Однако я бы использовал абстрактную фабрику, чтобы получить одну из нескольких различных реализаций кодирования для разных типов ввода.

person Tobias    schedule 14.02.2012