【问题标题】:KeyNotFoundException: The given key was not present in the dictionary C# [duplicate]KeyNotFoundException:字典C#中不存在给定的键[重复]
【发布时间】:2018-01-12 06:44:14
【问题描述】:

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

我收到KeyNotFoundException 错误:

给定的键在 Unity 的字典中不存在一段时间 搜索字典键。

下面添加了示例代码。

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

我错过了什么?我需要在代码中进行的任何建议更改

我在 Dict 中插入了数据,很抱歉我错过了在此处发布的内容 类

[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; }
}

字典和代码:

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

//这个被调用一次

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]);
    }

}

【问题讨论】:

  • 哪行代码给你错误?你能分享“GET DATA”点击和“GET DATA CAST”点击的代码吗?以及填充“KeyValueData”的位置。
  • 你有没有用[AnimName.IDLE] 的键将一些东西放入KeyValueData 中?否则字典出现 - 从你的代码 - 是空的,因此错误消息:)
  • 因为你的字典在我看来是空的
  • 老实说,错误消息并没有告诉您确切的问题吗?
  • @ChetanRanpariya,它已经发布了问题

标签: c# dictionary unity3d


【解决方案1】:

第二个中的a 与 AnimName.IDLE 不是同一个对象。如果您考虑一下,您已经明确地创建了一个 new 对象。默认情况下,它使用引用相等,只有当它是完全相同的对象实例时才会匹配。

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

或者,坚持使用静态只读变量来涵盖您想要的所有可能性。这当然取决于您在编译时了解所有可能的值。

【讨论】:

    【解决方案2】:

    您必须实现一个自定义EqualityComparer 来比较名称。将它传递给字典的构造函数将解决问题。否则,字典将使用在您的情况下不相等的引用进行比较。

    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();
        }
    }
    

    创建字典时使用比较器:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多