KeyNotFoundException:给定的键不在字典中

时间:2016-03-12 05:01:41

标签: c# dictionary unity3d

如果被问到这个问题,我很抱歉,因为我错过了一些非常基本的东西。

我收到 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;
    }
}

2 个答案:

答案 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 是正确的,当使用自定义类型作为字典中的键时,您必须定义GetHashCodeEquals。为了兴趣,我已经包含了替代哈希算法。

现有的Point类计算哈希值如下:

public override int GetHashCode()
{
  return this.x ^ this.y;
}

使用 ReSharper 代码完成:

public override int GetHashCode()
{
  unchecked
  {
    return (this.x * 397) ^ this.y;
  }
}