如果我被问到这个问题,我很抱歉,因为我错过了一些非常基本的东西。
我收到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; }
}
Dict and Code:
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]);
}
}
答案 0 :(得分:2)
a
与AnimName.IDLE不是同一个对象。如果你考虑一下,你已经明确地创建了一个 new 对象。默认情况下,它使用引用相等性,只有当它与对象的完全相同时才匹配。
如果您希望能够创建这样的新AnimName
个对象,并将它们视为与之前创建的对象相同,则需要向AnimName
类添加代码以告诉它什么是相等的什么不是。 http://www.aaronstannard.com/overriding-equality-in-dotnet/似乎是一个很好的起点。
或者只是坚持使用静态只读变量来满足您想要的所有可能性。这当然取决于你在编译时知道所有可能的值。
答案 1 :(得分: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());