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