2013-05-17 3 views
1

Есть ли простой способ сделать хэш-ключ для класса на основе его данных ??? Или какой-то интерфейс для этого?Как сделать объекты с одинаковыми данными одинаковыми?

У меня есть Dictionary<MyClass, int>.

MyClass очень прост, она содержит имя и массив строк:

class MyClass 
{ 
    public string Name {get; private set;} 
    public string[] Attributes {get; private set; } 

    //and a constructor and some methods 
} 

Теперь, если у меня есть два MyClass экземпляров, содержащих одни и те же имена и атрибуты, мне нужно, что словарь считать, если они имеют одинаковые ключ.

Я попытался сделать его структурой и попытался сделать также Dictionary<string[], int>, но все три случая равны, dicionary видит разные ключи для каждого экземпляра, даже если с одинаковыми данными.

Я мог бы создать строковый ключ с алгоритмом, принимающим имя и все параметры, и создать Dictionary<string, int>, но я бы хотел что-то более автоматическое. Есть ли другой путь? Может быть, интерфейс (который не избегал бы алгоритма, но лучше, чем ничего).

+0

Возможный дубликат [Когда мы делаем GetHashCode() для Словаря?] (Http://stackoverflow.com/questions/1407380/when-do-we-do-gethashcode-for-a-dictionary) (Также релевантно: [Почему важно переопределить GetHashCode, когда метод Equals переопределен?] (http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method- is-overridden)) –

+0

Ведется ли порядок строк в атрибутах «Атрибуты»? Случай? Является ли элемент 'null'' Attributes' равным ненулевой, но пустой? Наличие двух из этих классов «равным» не является очевидным или простым. – dlev

+0

Все имеет значение, но нулевые атрибуты невозможны. (Пустой разрешен) –

ответ

4

Чтобы сравнить экземпляры по значению, вам необходимо переопределить Equals() и GetHashCode().

+0

Ницца .... но .... создать хэш 'int' было бы ужасно. И с таким количеством строк это, вероятно, было бы недостаточно. Является ли 'Equals()' достаточным, чтобы словар распознал их как же? –

+1

@ Даниэль: Нет. Весь смысл словаря - использовать хэш-код для создания индекса для каждого объекта. (читайте о хэш-таблицах в Википедии) – SLaks

+0

Правильно, но строка с 32 символами имеет больше комбинаций, чем 32-битный int. Как dicionaries справляются с этим, используя хэш-код int32? –

Смежные вопросы