2012-04-28 3 views
1

У меня есть (очень много) объектов Foo с уникальным ID и хотите сохранить их в Dictionary. Клавиша словаря на C# может быть любым примитивным типом или объектом. Я мог бы использовать целое число foo1.ID как ключ, но также и объект foo1.Каков правильный способ использования словаря в C#?

Каков правильный способ его реализации и есть ли разница в производительности, используя либо ID (целое число), либо объект как ключ?

NB. Значения в словаре - это другие (типы) объектов.

+4

Зачем использовать словарь для этого? – Oded

+0

[HashSet ] (http://msdn.microsoft.com/en-us/library/bb359438.aspx) и [KeyedCollection ] (http://msdn.microsoft.com/en-us/library/ms132438. aspx) может представлять интерес. – dtb

+0

Целью является получение значения в O (1). При поиске в словаре у меня есть Object (не только ID). Мне было интересно, есть ли лучшая практика. – Oosterman

ответ

2

Как вы собираетесь: найти словарь? Если вы намерены искать элементы в словаре, основанные исключительно на ID, тогда используйте это как ключ. OTOH, если у вас будет экземпляр Foo, тогда сделайте это ключом.


Re: ваши изменения - теперь мы знаем, что Foo либо «ключ» или «объект, который обеспечивает значение ключа путем доступа к собственности», то, кажется, просто сказать, использовать Dictionary<Foo,OtherClass> - предполагая, что вы настроили сопоставления равенства на объектах Foo соответственно - зачем заставить каждый экземпляр поиска узнать, чтобы извлечь конкретное свойство из объектов Foo?

2

Это зависит от вашего варианта использования. Предполагая, что вы хотите искать объекты с учетом их значения ключа, вы, конечно же, хотите, чтобы идентификатор был ключом. То, что вы задаете этот вопрос, заставляет меня подумать, может быть, вам не нужен словарь вообще - если вам просто нужно сохранить набор элементов, используйте вместо него List<T> - словари предназначены для сопоставления ключа (например, id) со значением (например, пользовательский объект).

+0

Возможно, я не был достаточно ясен в части «значений» словаря. Значения являются объектами другого типа. – Oosterman

+1

@Oosterman: Тогда я бы выбрал все, что было бы самым чистым для вас, как ключ - если у вас есть сомнения, хотя я бы предпочел значение id, хотя использование полного объекта может также иметь смысл, потребуются дополнительные усилия, такие как переопределение равенства и 'GetHashCode', если необходимо – BrokenGlass

+0

Если я вижу' Dictionary 'и все, что у меня есть, это' Foo', я должен проверить, чтобы убедиться, что я выбираю свойство right из объекта 'Foo'. Если у меня есть словарь ', мне не нужно гадать. Почему вы предпочитаете 'id'? –

0

Используйте идентификатор - если у вас уже есть объект, вам тоже нечего искать.

1

Все, что вы используете в качестве ключа, должно быть сравнимо. Для примитивных типов равенство определяется в общем, как и следовало ожидать. Для объектов вы будете тестировать ссылочное равенство, если вы не определите другой способ сравнения объектов, который вы можете сделать, передав соответствующий тип IComparer в конструкторе Dictionary.

В вашем случае, однако, ключ к int, вероятно, будет самым простым. Вы не получите реальной выгоды от использования объекта в качестве своего собственного ключа. Вы можете создать словарь, просто принимая вашу коллекцию Foo объектов и делать что-то вроде:

IDictionary<int, Foo> fooDictionary = fooCollection.ToDictionary(f => f.ID); 

Поиск словаря будет более эффективным, чем просто поиск коллекции для данного ID каждый раз, когда в большинстве случаев.

1

Словари: Key Value Pairs. Каждый ключ должен быть уникальным. Компилятор должен убедиться, что ключи уникальны. Предоставляя ключ как объект вместо целого числа, вы, вероятно, делаете перебор. Компилятор сравнивается с проверкой всего объекта в ключе, чтобы убедиться, что он уникален. Поэтому я бы пошел за Integer Key, если это поможет вам идентифицировать вашу запись однозначно.