Словарь или KeyedCollection?

У меня есть класс (SomeClass), который содержит свойство Name типа string. И мне нужно сохранить массив этого класса и найти его элементы по их именам. Для этого существуют два типа коллекций: KeyedCollection и Dictionary. Мой вопрос: какая разница между ними и в таком случае. Лучше использовать KeyedCollection и Dictionary? Спасибо за любую помощь в объяснении.

Ответ 1

Ни один из предыдущих комментариев не касается наиболее важной разницы между двумя: KeyedCollection сохраняет ваши позиции в том порядке, в котором они добавлены (первый добавленный элемент находится в индексе 0, а последний добавлен к последнему индексу). Словарь не позволяет (или, по крайней мере, никогда не гарантирует этого).

Это дополнительное преимущество KeyedCollection имеет небольшую стоимость. Под обложками вы оплачиваете стоимость содержания как Словаря, так и списка.

Ответ 2

Вот хорошее объяснение различий между Словарем и KeyedCollection: http://geekswithblogs.net/NewThingsILearned/archive/2010/01/07/using-keyedcollectionlttkey-titemgt.aspx

Основные моменты:

  • KeyedCollection является абстрактным, поэтому вы не можете использовать его напрямую.
  • KeyedCollection полезен для случаев, когда ключ находится в самом сущности, тогда вы можете инкапсулировать поиск ключей в рамках реализации коллекции.
  • Существуют общие реализации для KeyedCollection (но не в структуре), которые позволяют вставлять делегата поиска ключей в конструктор коллекции, поэтому вам не нужно повторять его каждый раз, когда вы добавляете элемент.

Ответ 3

По умолчанию KeyedCollection создает словарь под обложками.
Если ключ также имеет значение как часть значения, а также определяет уникальность, то это цель KeyedCollection.

Если вы хотите изменить поддержку словаря, используйте этот ctor:

protected KeyedCollection(
IEqualityComparer<TKey> comparer,
int dictionaryCreationThreshold)

Ответ 4

A KeyedCollection позволяет изменять ключи и способы управления сменой ключа. Словарь не позволяет изменять ключ. Во-вторых, если у вас есть коллекция, которая нуждается в поиске, логика для извлечения ключа из объекта остается в одном месте, тогда как при сохранении словаря необходимо будет поместить логику извлечения ключей в каждое место, где элементы будут добавлены/удалены из словаря.

Ответ 5

A KeyedCollection следует использовать, когда ключ находится в самом элементе.

По умолчанию KeyedCollection является оберткой Collection<TItem> вокруг словаря. Когда вы используете небольшие коллекции и/или предпочитаете напрямую получать элементы, KeyedCollection предоставляет конструктор, который принимает параметр dictionaryCreationThreshold, который указывает, на какой счет коллекции нужно перейти на Dictionary.
Еще один аспект в KeyedCollection заключается в том, что вы можете переключить свойство ключа (пока совпадают их типы). Это может быть полезно для предметов с двойной клавишей и т.д. По производительности, я не думаю, что упаковка словаря имеет много накладных расходов, за исключением случаев, когда вы создаете кучу экземпляров KeyedCollection, или если вы используете действительно большие коллекции (есть некоторые внутренние проверки null, чтобы определить, есть ли словарь).
Одна вещь, которую я надеюсь увидеть в KeyedCollection, - это un abstract ing, но вы можете сделать общий конкретный тип так же легко.

Ответ 6

Вы не можете использовать KeyedCollection, потому что он абстрактный: http://msdn.microsoft.com/en-us/library/ms132438.aspx. Это означает, что вы не можете создать его объект.