Как я могу преобразовать список C # в нечто, что можно хэшировать? - PullRequest
2 голосов
/ 17 июня 2010

Я хочу что-то вроде кортежей Python (или, для множеств, frozensets), которые можно хэшировать. У меня есть List<String>, который наверняка неправильно хешируется (т.е. по значению).

1 Ответ

3 голосов
/ 17 июня 2010

Вы должны будете определить свой собственный контейнер, возможно, оборачивая список, чтобы получить полезную семантику для равенства хэш-равных (GetHashCode и Equals).Вы можете даже сделать оболочку соответствующей IList, если хотите.

Чтобы избежать проблем изменчивости и изменения результатов GetHashCode / Equals (что может привести к проблемам с использованием вашего нового объекта в словаре хеширования, проблематично!), Вы также должны предоставитькакой-то тип защиты (возможно, сделайте копию ввода при создании вашего типа) и / или задокументируйте ограничения.

Вы можете использовать SequenceEqual для реализации Equals довольно тривиально, но вы 'Вам нужно будет реализовать GetHashCode соответствующим способом - простой метод - это смещение XOR GetHashCode каждого элемента.

В качестве альтернативы, если он используется только в одном словаре, вы можете указать пользовательский * 1009.* IEqualityComparer и избегайте создания обернутого типа: Перегрузка конструктора словаря .

Это зависит от ваших конечных целей, и очень хорошо, что такие контейнеры обертывания уже существуют: -)

Примечание: в .NET4 есть набор классов Tuple <...> , которые переопределяют GetHashCode aи равноСм. cadenza как стороннюю альтернативу для предыдущих версий .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...