Лучшая коллекция c # для больших ключей - PullRequest
0 голосов
/ 16 августа 2010

Я занимаюсь разработкой многоязычного веб-сайта ASP.NET.Я хочу, чтобы пользователи могли добавлять переводы «на лету», поэтому я храню переводы в базе данных и поддерживаю объект приложения ASP.NET, содержащий все переводы (для повышения производительности).Я использую простой Hashtable для хранения переводов, затем сохраняю это в объекте Application и ссылаюсь на него при рендеринге страницы.

Некоторые записи перевода короткие, некоторые длинные.Все зависит от того, что пользователь хочет перевести.Всякий раз, когда сайт отображает, скажем, метки управления или текст справки, он проверяет Hashtable, чтобы увидеть, содержит ли он перевод для английской версии, и если он это делает, то использует версию Hashtable (предполагается, что пользователь на иностранном языке - я использую отдельныйОбъекты уровня приложения для каждого языка).

Типичная запись в Hashtable может быть следующей: key = 'Что делать сегодня', value = 'Mon Charge pour aujourd'hui'.Код просматривает таблицу «Что делать сегодня» - если найден перевод, он использует его, а если нет, то использует только английскую версию.

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

Ответы [ 3 ]

1 голос
/ 16 августа 2010

Я предлагаю альтернативный подход - создайте «скрипт», который преобразует переводы из вашего пользовательского источника (БД или что у вас есть) в файлы ресурсов .NET, вставьте команду, которая запустит его в событие Before-Build вашего проекта.,Таким образом, вы сможете использовать встроенную функциональность локализации платформы .NET и по-прежнему сможете хранить переводы в любом месте.

Как Iain Galloway прокомментировал:

Почти всегда стоит идти с зерном платформы, а не против него.

0 голосов
/ 16 августа 2010

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

Однако для производительности это не выполняется.При использовании набора значений ключей (например, хеш-таблицы или словаря) хеш, который используется в словаре, вычисляется с использованием входных данных.Т.е. если ваш ключ "abcdefg", он хэшируется с помощью функции GetHashcode ().Эта функция, очевидно, использует больше вычислительной мощности, если ваш ввод в gethashcode (то есть входная строка abcdefg) длиннее.Например, вы можете сделать gethashcode константной функцией O (1) с точки зрения длины строки, переопределив функцию и разрешив ей возвращать хеш-код, основанный на постоянном количестве входных символов вашей строки.Конечно, это может нарушить баланс вашей хэш-таблицы, что приведет к замедлению поиска.Вы должны проверить это, чтобы быть уверенным.

Другое решение состоит в том, чтобы сохранить словари / хеш-таблицы для каждого языка и использовать в качестве ключа некоторые короткие сокращения.При поиске у вас будет оператор switch, который выбирает правильный словарь и извлекает строку, используя сокращенный ключ.Недостатком этого является то, что вы увеличиваете использование памяти, но в теории уменьшает время поиска.Кроме того, в этом случае вы должны провести сравнительный анализ, чтобы убедиться, что есть (положительная) разница.

Как и sidenote, для меня это звучит как преждевременная оптимизация.Я не думаю, что такие поиски станут узким местом для вашего приложения.

0 голосов
/ 16 августа 2010

Если вам нужен быстрый доступ, вы можете попытаться увеличить Trie

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