【发布时间】:2016-06-07 18:22:56
【问题描述】:
这就是我创建 SortedDictionary 的方式:
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。即使键显然存在于字典中。
知道导致此问题的原因是什么吗?也许是我的自定义比较器?
【问题讨论】:
-
您的比较器正在混合引用相等和值相等。特别是如果您有两个具有相同
AtomicPosition.x值的Structure对象,则它们不会被视为相等。这很糟糕,因为Compare(a,b)和Compare(b,a)都会返回 -1。 -
怎么回事?我这样做:如果(a == b)返回 0,所以如果两个对象相同,甚至在查看原子位置之前它应该返回 0
-
因为
a == b正在进行参考比较(除非您实际上已经为Structure加载了== 运算符)。看来您的比较器应该只是return a.AtomicPosition.x.CompareTo(b.AtomicPosition.x); -
为什么不在比较中为未找到的键之一添加条件断点并查看它的作用?
-
@kamac
a == b如果它们只是相同的对象,而不是如果它们具有相同的AtomicPosition.x。因此,当字典尝试对具有相同AtomicPosition.x的两个不同Structure对象进行排序时,即使您交换它们,它也会始终认为第一个小于第二个。基本上你会有 a
标签: c# dictionary unity3d