Dictonary.ContainsKey Сравнение - PullRequest
3 голосов
/ 13 октября 2011

Я пытаюсь сделать что-то вроде следующего:

class Test
{
     public string Name { get; set;}
     public string Location { get; set;}
     public Test(string name, string location)
     {
         Name = name;
         Location = location;
     }
}

Теперь в методе из другого класса я пытаюсь добавить эти тестовые классы в словарь с KeyValuePair, равным

Dictionary<Test,int> resources = new Dictionary<Test,int>();
resources.Add(new Test("First Resource", "Home"), 1);

Теперь я пытаюсь сделать следующее:

bool contains = resources.ContainsKey(new Test("First Resource", "Home"));
resources[new Test("First Resource", "Home")] = 2;

На данный момент это возвращает false. Как я могу получить это, чтобы вернуть истину?

Я попытался переопределить функцию Equals моего класса Test и даже реализовать IComparible и выполнять пользовательские сравнения.

Ответы [ 3 ]

4 голосов
/ 13 октября 2011

Вам необходимо реализовать GetHashCode и Equals в классе ключей или , чтобы обеспечить реализацию IEqualityComparer<Test> в конструкторе словаря.

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

(Для хорошего набора рекомендаций по GetHashCode, пожалуйста посетите этот блог .)

4 голосов
/ 13 октября 2011

Вам необходимо переопределить GetHashCode в вашем классе Test, добавьте в свой класс следующее:

public override int GetHashCode()
{
    return (Name+Location).GetHashCode();
}

Это обеспечит, чтобы любые два экземпляра Test имели одинаковый хэш, только если объединение Name и Locationтот же самый.Вы можете использовать другие стратегии для этого, однако, это самая простая форма.

3 голосов
/ 13 октября 2011

Словарь использует GetHashCode ключа, чтобы определить, в каком контейнере данных следует хранить объект, а затем Equals, чтобы убедиться, что объекты фактически равны. Другими словами, чтобы это работало, вам нужно реализовать GetHashCode() и Equals для вашего типа .

Хорошей практикой считается сделать объекты, используемые для ключей в словаре, неизменяемыми. Если объект изменяется, его хеш-код изменяется, и вы не сможете найти его в словаре.

...