2016-06-07 4 views
-1

Это, как я создаю мой SortedDictionary:C# SortedDictionary ContainsKey возвращает ложь, даже если ключ существует

protected class OccupiedComparer : IComparer<Structure> 
{ 
    public int Compare(Structure a, Structure b) 
    { 
     if (a == b) 
      return 0; 

     if (a.AtomicPosition.x > b.AtomicPosition.x) 
      return 1; 
     else 
      return -1; 
    } 
} 

protected SortedDictionary<Structure, Vector2> m_BuildingOccupied = new SortedDictionary<Structure, Vector2>(new OccupiedComparer()); 

я запускаю этот код:

m_BuildingOccupied.Add(s, new Vector2(x, y)); 
foreach (var k in m_BuildingOccupied.Keys) { 
    bool c = m_BuildingOccupied.ContainsKey(k); 
    int hs = k.GetHashCode(); 
    Debug.Log(hs + ", " + c); 
} 

И даже несмотря на все добавленные ключи выводятся на консоль , некоторые из них имеют «c», равный false, что означает, что ContainsKey возвращает false. Даже если ключ, очевидно, присутствует в словаре.

Любая идея, что может быть причиной этой проблемы? Возможно, мой заказчик?

+1

Ваш компаньон смешивает ссылочное равенство и равенство значений. В частности, если у вас есть два объекта 'Structure' с тем же значением« AtomicPosition.x », они не рассматриваются как равные. Это плохо, потому что 'Compare (a, b)' и 'Compare (b, a)' оба возвращают -1. – juharr

+0

Как получается? Я делаю: if (a == b) возвращает 0, поэтому он должен возвращать 0, если два объекта одинаковы, даже если смотреть на атомную позицию. –

+0

Поскольку 'a == b' выполняет ссылочное сравнение (если вы на самом деле не загружены оператор == для 'Structure'). Кажется, что ваш компаратор должен просто быть «return a.AtomicPosition.x.CompareTo (b.AtomicPosition.x);' – juharr

ответ

-1

оператор по умолчанию == сравнивает ссылки классов

решение:

перегрузки Equals и GetHashCode() или сравнить все поля вместо этого.

+1

'a == b' и' a.Equals (b) 'будут одинаковыми, если только' == 'перегружен для' Structure', или 'Equals' переопределяется для' Structure', все же дают тот же результат. – juharr

+0

Нет, для structres они работают по-разному, Equals сравнивают все поля объекта == isnt –

+0

@ Dr.Haimovitz * Structure * - это класс, это только имя * Structure * –

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