【Unity + C#】键为类的字典的问题
问题
-
我有一个类,这个类由一个枚举类型和一个 int 组成
[Serializable]
public enum TerrainType
{
Player = -1, Empty = 0, Wall = 1, Coin, Gem, Flower, Goal, Spike, Belt, TurnBelt, Lever, Door, Key, Portal, Rock,
}
[Serializable]
public class TerrainUnit
{
public TerrainType Type;
public int State;
}
-
我创建了一个字典,键即为 TerrainUnit,值为 Sprite Dictionary<TerrainUnit, Sprite> Dict 我在调用时,发现这个问题: 这里假设 A,B,X 为一个具体的对应类型的内容。
TerrainUnit tu = new TerrainUnit();
tu.Type = A;
tu.State = B;
Dict[tu] = X;
TerrainUnit tu = new TerrainUnit();
tu.Type = A;
tu.State = B;
Y = Dict[tu]
-
然后出错,找不到键为tu的值 WTF,为啥?
错误原因
-
首先,Dictionary 为哈希表,SortedDictionary 为有序字典 这里的哈希表,由于实例不同,尽管实例里面的这俩属性的值相同,但获得的哈希值不同了
使用 Dictionary 进行修改
-
既然是哈希表,那么我们重写获得的哈希值和比较函数即可
[Serializable]
public class TerrainUnit
{
public TerrainType Type;
public int State;
// 重写比较函数
public override bool Equals(object obj)
{
TerrainUnit other = obj as TerrainUnit;
int x1 = GetHashCode();
int x2 = other.GetHashCode();
return x1 == x2;
}
// 重写哈希值
public override int GetHashCode()
{
return ((int)Type) * 100 + State;
}
}
使用 SortedDictionary 进行修改
-
既然是一个字典,那么我们需要重写比较函数
[Serializable]
public class TerrainUnit : IComparable // 注意这里需要继承这个比较接口
{
public TerrainType Type;
public int State;
// 写一下比较函数,注意函数的返回类型需要是 int
// -1 表示目前的小,0 表示相同,1 表示目前的大
public int CompareTo(object obj)
{
TerrainUnit other = obj as TerrainUnit;
if (other == null) return 1;
if (Type != other.Type)
{
if (Type < other.Type) return -1;
return 1;
}
if (State != other.State)
{
if (State < other.State) return -1;
return 1;
}
return 0;
}
}
下一篇:
同步、异步、阻塞、非阻塞的概念
