Каков наиболее эффективный способ создать постоянное (никогда не изменяется во время выполнения) сопоставление string
s с int
s?
Я пробовал использовать const Dictionary , но это не сработало.
Я мог бы реализовать неизменяемую оболочку с соответствующей семантикой, но это все еще кажется не совсем правильным.
Для тех, кто спросил, я реализую IDataErrorInfo в сгенерированном классе и ищу способ выполнить поиск columnName в моем массиве дескрипторов.
Я не знал (опечатка при тестировании! Ох!), Что переключатель принимает строки, так что я собираюсь использовать его. Спасибо!
c#
.net
collections
dictionary
constants
Дэвид Шмитт
источник
источник
Ответы:
Создание действительно сгенерированного во время компиляции словаря констант в C # на самом деле не является простой задачей. На самом деле ни один из ответов здесь не дает этого.
Однако есть одно решение, которое соответствует вашим требованиям, хотя и не обязательно хорошее; помните, что в соответствии со спецификацией C # таблицы вариантов переключения компилируются в таблицы переходов с постоянным хешем. То есть это постоянные словари, а не серия операторов if-else. Рассмотрим такой оператор switch-case:
Это именно то, что вам нужно. И да, я знаю, это некрасиво.
источник
В текущей структуре очень мало неизменяемых коллекций. Я могу придумать один относительно безболезненный вариант в .NET 3.5:
Использование
Enumerable.ToLookup()
-Lookup<,>
класс неизменяемый (но многозначный по правому краю); вы можете сделать этоDictionary<,>
довольно легко:источник
источник
Это самое близкое к "словарю CONST":
Компилятор будет достаточно умен, чтобы собрать код как можно более чистым.
источник
При использовании 4.5+ Framework я бы использовал ReadOnlyDictionary (также ReadOnly Collection для списков), чтобы делать сопоставления / константы только для чтения. Это реализовано следующим образом.
источник
private static readonly Dictionary<string, string> _yourDictionaryName = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase) { { "One",1 }, { "Two",2 }, { "Three",3 }, };
Вот как я это сделал.readonly Dictionary<TKey, TValue>
не эквивалентно aReadOnlyDictionary<TKey, TValue>
. Фактически, их способ «только для чтения» в значительной степени противоположен друг другу. См. Dotnetfiddle.net/v0l4aA .Почему бы не использовать пространства имен или классы для вложенности ваших значений? Он может быть несовершенным, но очень чистый.
Теперь вы можете получить доступ к .ParentClass.FooDictionary.Key1 и т. Д.
источник
Кажется, что не существует стандартного неизменяемого интерфейса для словарей, поэтому, к сожалению, создание оболочки кажется единственным разумным вариантом.
Изменить : Марк Гравелл нашел ILookup, который я пропустил, - это позволит вам, по крайней мере, избежать создания новой оболочки, хотя вам все равно нужно преобразовать словарь с помощью .ToLookup ().
Если это необходимость, ограниченная конкретным сценарием, вам может быть лучше с интерфейсом, более ориентированным на бизнес-логику:
источник
Я не уверен, почему никто не упомянул об этом, но в C # для вещей, которым я не могу назначить const, я использую статические свойства только для чтения.
Пример:
источник
Еще одна идея, поскольку я привязываюсь к комбинированному списку winforms:
Чтобы получить значение int из отображаемого имени из :
использование:
источник
Почему нет:
источник