2016-12-01 3 views
0

я видел по крайней мере, 3 предложения по реализации пользовательского сравнения:Ключ сравнения для словаря, где соединение ключ является классом снова

  • Переопределения GetHashCode() и Equals() в классе.
  • Конструктор, который реализует IEqualityComparer<TKey>
  • Linq метод расширения Contains, что позволяет передавать в IEqualityComparer<T>

Мой вопрос - есть ли нужно делать что-либо вообще для стандартного сравнения для такого ключа соединения или это зависит на классе?

E.g. следующий сниппт работает должным образом:

Dictionary<TariffKey, RefCusNomenclatureGroup> tariff = new Dictionary<TariffKey, RefCusNomenclatureGroup>(); 

// dictionary populated 
var trfKey = new TariffKey { Code = "xyz", SortKey = "123" }; 

if (tariff.ContainsKey(trfKey)) // compared as expected - match - when both string fields are equal 
{ 
     //do something here 
} 

struct TariffKey 
{ 
    public string Code { get; set; } 
    public string SortKey { get; set; } 
} 
+0

Вы имеете в виду, что у вас есть рабочий код **, но вы боитесь, что сделали неправильный путь, потому что другие сказали, что вы должны сделать что-то еще? –

ответ

0

Мое упущение. Словарный ключ был объявлен как struct. Struct - тип значения. Как только

struct TariffKey 

изменен

public class TariffKey 

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

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