KeyNotFoundException:字典C#中不存在给定的键

KeyNotFoundException: The given key was not present in the dictionary C#

本问题已经有最佳答案,请猛点这里访问。

对于这个问题,我很抱歉,因为我错过了一些难以置信的基本知识。

我得到KeyNotFoundException,错误:

The given key was not present in the dictionary from Unity for a
search for a Dictionary Key.

下面添加了示例代码。

当我按GUI上的GET DATA按钮时,它工作正常。但是当我按下GUI上的GET DATA CAST按钮时,它给出了KeyNotFoundException

我缺少什么?我需要在代码中进行的任何建议的更改

我将数据插入了Dict,抱歉,我错过了将其发布到此处

1
2
3
4
5
6
7
8
9
10
11
[System.Serializable]
public sealed class AnimName
{
    public static readonly AnimName IDLE = new AnimName("IDLE");

    public AnimName(string value)
    {
        Value = value;
    }
    public string Value { get; private set; }
}

词典和代码:

1
Dictionary<AnimName, AnimData> KeyValueData = new Dictionary<AnimName, AnimData>();

//这一次被称为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Start(){
KeyValueData.Add(AnimName.IDLE, new AnimData(new Vector3(-0.09f, -0.02f, -0.25f), new Vector3(-41.866f, 386.781f, -524.68f), new Vector3(-0.028f, 0.027f, 0.13f), new Vector3(18.724f, 19.477f, -32.435f), 0.3f));
}


void OnGUI()
{
    if (GUI.Button(new Rect(10, 10, 150, 100),"GET DATA"))
    {
        Debug.Log(KeyValueData [AnimName.IDLE]);
    }
    if (GUI.Button(new Rect(200, 10, 150, 100),"GET DATA CAST"))
    {
        AnimName a = new AnimName("IDLE");
        Debug.Log(KeyValueData [a]);
    }

}


您必须实现一个自定义的EqualityComparer,用于比较名称。将其传递给字典的构造函数将解决问题。否则,词典将使用您参考中不相等的参考进行比较。

1
2
3
4
5
6
7
8
9
10
11
12
class AnimNameEqualityComparer: EqualityComparer<AnimName>
{
    public override bool Equals(AnimName a1, AnimName a2)
    {
         return a1.Value.Equals(a2.Value)
    }

    public override int GetHashCode(AnimName a)
    {
        return a.Value.GetHashCode();
    }
}

在创建字典时使用比较器:

1
Dictionary<AnimName, AnimData> KeyValueData = new Dictionary<AnimName, AnimData>(new AnimNameEqualityComparer());

第二个

a与AnimName.IDLE是不同的对象。如果您考虑一下,就已经明确创建了一个新对象。默认情况下,它使用引用相等,仅当它与对象完全相同时才匹配。

如果您希望能够创建像这样的新AnimName对象,并认为它们与先前创建的对象相等,则需要向AnimName类中添加代码以告诉它什么相等,什么不相等。 http://www.aaronstannard.com/overriding-equality-in-dotnet/似乎是这样做的一个很好的起点。

或者只是坚持使用静态只读变量来覆盖所需的所有可能性。当然,这确实取决于您在编译时知道所有可能的值。