Это, как я создаю мой 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. Даже если ключ, очевидно, присутствует в словаре.
Любая идея, что может быть причиной этой проблемы? Возможно, мой заказчик?
Ваш компаньон смешивает ссылочное равенство и равенство значений. В частности, если у вас есть два объекта 'Structure' с тем же значением« AtomicPosition.x », они не рассматриваются как равные. Это плохо, потому что 'Compare (a, b)' и 'Compare (b, a)' оба возвращают -1. – juharr
Как получается? Я делаю: if (a == b) возвращает 0, поэтому он должен возвращать 0, если два объекта одинаковы, даже если смотреть на атомную позицию. –
Поскольку 'a == b' выполняет ссылочное сравнение (если вы на самом деле не загружены оператор == для 'Structure'). Кажется, что ваш компаратор должен просто быть «return a.AtomicPosition.x.CompareTo (b.AtomicPosition.x);' – juharr