Что нужно сделать, чтобы использовать значение ссылочного типа в качестве словарного ключа? - PullRequest
3 голосов
/ 21 мая 2010

Предположим, у меня есть класс T, который я хочу использовать в качестве ключа в коллекции Dictionary<T,U>.

Что я должен реализовать в T, чтобы эти ключи основывались на значениях T, а не T ссылок?

Я надеюсь, что это просто GetHashCode().

Ответы [ 4 ]

5 голосов
/ 21 мая 2010

Вы должны реализовать GetHashCode () и Equals ().

Словарь - это хеш-таблица ниже обложек, поэтому вы можете прочитать ее: Подводные камни равенства / GetHashCode - как работает хеш-таблица?

3 голосов
/ 21 мая 2010

Либо реализуйте Equals и GetHashCode или создайте подходящее IEqualityComparer<T>, которое имеет правильную форму соответствия на вашей карте. 1010 *

Мне скорее нравится маршрут IEqualityComparer<T>: во многих случаях не существует одной явно правильной формы равенства - вы хотите рассматривать объекты как равные по-разному в зависимости от ситуации. В этом случае пользовательский компаратор равенства - это как раз то, что вам нужно. Конечно, если является естественной операцией равенства, имеет смысл реализовать IEquatable<T> в самом типе ... если вы можете. (Другое преимущество IEqualityComparer<T> заключается в том, что вы можете реализовать его для типов, которые вы не можете контролировать.)

3 голосов
/ 21 мая 2010

Если вы не передадите IEqualityComparer<T> в конструктор словаря, он будет использовать EqualityComparer<T>.Default, который определяется MSDN как:

Свойство Default проверяет, тип T реализует System.IEquatable (Of T) интерфейс и, если это так, возвращает EqualityComparer (Of T), который использует эту реализацию. Иначе, он возвращает EqualityComparer (Of T), который использует переопределения Object.Equals и Object.GetHashCode предоставлены T.

Таким образом, реализация IEquatable<T> будет моим выбором (если вы реализуете его, имеет смысл переопределить Equals и GetHashCode в любом случае).

2 голосов
/ 21 мая 2010

Вам необходимо переопределить Equals(object obj). Всегда ожидается, что вы реализуете GetHashCode при изменении Equals. Прочитайте эту статью на MSDN.

...