2016-08-28 4 views
0

Я знаю, что HashSet может использовать базовые типы, такие как string и int, мой вопрос в том, какие типы можно использовать в HashSet. Я пытаюсь создать HashSet декартовых коордов, которые извлекают выгоду из HashSet из-за отсутствия дубликатов. Я попробовалИспользуемые типы HashSet?

HashSet<int[]> temp = new HashSet<int[]>{new int[]{1,1}, new int[]{1,1} } 

но это не работает. Ищете тип, который я могу использовать для создания списка уникальных коордов.

+4

Любой тип 'T', для которого вы можете определить правильный' IEqualityComparer ', который реализует ваше значение равенства, может использоваться в' HashSet '. – PetSerAl

+0

Итак, Point не дает ничего, чтобы показать, что он будет использовать IEqualityComparar на веб-сайте Microsoft. Я посмотрел на Tuple [link] (https://msdn.microsoft.com/en-us/library/dd268536 (v = vs.110) .aspx), тогда это будет полезно использовать в качестве HashSet из >? – Edward

+0

Что вы действительно спрашиваете, почему ваши два массива не воспринимаются как одно и то же в хэш-наборе, что по сути является тем же вопросом, что и в отмеченном дубликате. Другим очень близким дублированием является https://stackoverflow.com/questions/7244699/gethashcode-on-byte-array. См. Также https://stackoverflow.com/questions/7138382/array-comprasion-as-dictionary-keys-in-c-sharp и https://stackoverflow.com/questions/15941389/why-does-my-dictionary- сохраняя в виду, что словари в основном такие же, как и хэш-множества, за исключением того, что они соединяют значение с каждым ключом. –

ответ

3

Вы создаете HashSet ссылочных типов. Содержимое ссылочного типа (если только String) не сравнивается при сравнении равенства, а только сам указатель ссылок.

Вы добавляете два экземпляра массива в массив экземпляров массива HashSet. Поскольку ссылочные типы обычно не сравниваются друг с другом с использованием их содержимого, а только их «ссылкой на память», ваш код не будет работать так, как вы его намереваетесь. Эти два экземпляра отличаются друг от друга - хотя их содержание одинаковое.

Класс Tuple переопределяет это поведение и сравнивает один экземпляр с другим, используя сумму хэш-кодов его членов. Int [] Массивы не переопределяют это поведение. Большинство типов ссылок .net не переопределяют операторов сравнения. Исключение составляет Tuple.