如果被问到这个问题,我很抱歉,因为我错过了一些非常基本的东西。
我收到 KeyNotFoundException:来自Unity的词典中没有给定的键用于搜索词典键。 然而,在我的(仍然非常小的)项目中,我成功地在其他Dictionarys中使用MapLocation作为键
我已将代码删除为基础知识。
public class SpriteManager : MonoBehaviour {
Dictionary<MapLocation, GameObject> SpriteDictionary;
void Start(){
SpriteDictionary = new Dictionary<MapLocation, GameObject>();
for (int x = 0; x < 10; x++) {
for (int y = 0; y < 10; y++) {
//Create Location Data
MapLocation mLoc = new MapLocation(x, y);
//Create GameObjects
GameObject go = new GameObject();
SpriteDictionary.Add(mLoc, go);
}
}
MapLocation mTest = new MapLocation(0,1);
Debug.Log("Dictionary entry exists?: " + SpriteDictionary.ContainsKey(mTest));
}
最后,MapLocation(0,1)调试行的mTest给了我一个 false 。
这是完成的MapLocation代码。
using UnityEngine;
using System.Collections;
[System.Serializable]
public class MapLocation {
public int x;
public int y;
public MapLocation(){}
public MapLocation(int x, int y){
this.x = x;
this.y = y;
}
}
答案 0 :(得分:4)
您必须覆盖MapLocation的GetHashCode()
和Equals(object obj)
,例如:
public override bool Equals(object obj)
{
MapLocation m = obj as MapLocation;
return m == null ? false : m.x == x && m.y == y;
}
public override int GetHashCode()
{
return (x.ToString() + y.ToString()).GetHashCode();
}
在YourDictionary.ContainsKey(key)
和YourDictionary[key]
内,使用GetHashCode()
和Equals(object obj)
来判断等效内容。 Reference
答案 1 :(得分:1)
deyu note 是正确的,当使用自定义类型作为字典中的键时,您必须定义GetHashCode
和Equals
。为了兴趣,我已经包含了替代哈希算法。
现有的Point
类计算哈希值如下:
public override int GetHashCode()
{
return this.x ^ this.y;
}
使用 ReSharper 代码完成:
public override int GetHashCode()
{
unchecked
{
return (this.x * 397) ^ this.y;
}
}