В 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