这是我的代码:
public class MyKeyType
{
public int x;
public string operationStr;
}
private static Dictionary<MyKeyType, List<int>> m_Dict = new Dictionary<MyKeyType, List<int>>
{
{ new MyKeyType { x = MyValsType.File, operationStr = "LINK" }, new List<int> { 1,2,3,4,5 } },
{ new MyKeyType { x = MyValsType.File, operationStr = "COPY" }, new List<int> { 10,20,30,40,50 } },
.....
}
List<int> GetValList( int i, string op)
{
// The following line causes error:
return ( m_Dict [ new MyKeyType { x = i, operationStr = op } ] );
}
但是当我打电话时,我收到错误“字典中没有给定的密钥”:
GetValList( MyValsType.File, "LINK");
你能说出原因吗?非常感谢提前。
答案 0 :(得分:4)
当你使用一个类作为字典的键时,该类必须正确地实现GetHashCode()
和Equals:Dictionary调用这两个方法来理解那个&#34;那个键&#34;与其他键&#34;相同的是:如果2个实例x
和y
返回GetHashCode()
和x.Equals(y) == true;
相同的值,则2个键匹配。< / p>
在MyKeyType
类中不提供两个覆盖将导致在运行时调用object.GetHashCode()
和object.Equals
:仅当x和y是对x的引用时,这些才会返回匹配同一个实例(即object.ReferenceEquals(x, y) == true
)
许多.Net框架类型(例如字符串,数字类型,日期时间等)正确实现了这两种方法。对于您定义的类,您必须在代码中实现它们
答案 1 :(得分:1)
如果您能够使用LINQ,则可以将GetValList()更改为:
static List<int> GetValList(int i, string op)
{
return m_Dict.Where(x => x.Key.x == i && x.Key.operationStr.Equals(op)).Select(x => x.Value).FirstOrDefault();
}