В OrderedDictionary
перегруженной операции индексации , так что индексация с целым числом N
будет получить элемент в положении N
, при индексировании с Object
извлечет элемент coresponding к этому объекту. Если бы можно было создать OrderedDictionary<int, string>
под названиемmyDict
и добавить элементы (1, «Джордж») и (0, «Фред») в этом порядке, должно myDict[0]
возвращаться «Джордж» или «Фред»?
Такая проблема могла быть решена путем наложения ограничения класса на тип ключа. С другой стороны, большая часть полезности универсальных коллекций проистекает из их способности эффективно работать с типами значений. Наложение ограничения класса на тип ключа может показаться немного уродливым.
Если класс не должен был быть CLS-совместимым, а просто должен был работать с vb.net, разумный дизайн мог бы использовать именованные индексированные свойства. Таким образом, в приведенном выше примере, myDict.ByKey[0]
получилось бы «Фред», и myDict.BySequence[0]
уступил бы «Джордж». К сожалению, такие языки, как C #, не поддерживают именованные индексированные свойства. В то время как можно было бы кое-что добавить, чтобы разрешить использование вышеупомянутого синтаксиса даже без таких свойств, неудачное решение обернуть поля структур, таких как Point
и , но вместо этого изменить коллекцию, на которую он ссылается).Rectangle
означает, что для myDict.ByKey[0] = "Wally"
работы myDict.ByKey
придется вернуть новый объект класса. Структура была бы более эффективной, но компиляторы отклоняли бы то, что выглядело как запись в структуру только для чтения (несмотря на то, что свойство не изменило бы структуру, возвращаемуюByKey
Лично я думаю, что было бы неплохо иметь объект dictionary-ish, который был задан как отслеживающий порядок вставки; Я также хотел бы иметь объект dictionary-ish, который мог бы легко вернуть ключ, связанный с конкретным ключом (например, если у вас есть словарь без учета регистра и добавлена запись с ключом "GEORGE", может спросить у словаря, какой ключ связан с «Джорджем» без необходимости поиска по всем KeyValuePair
объектам, возвращенным в перечислении.
SortedDictionary<TKey, TValue>
: msdn.microsoft.com/en-us/library/f7fta44c.aspx