c#”;给定的密钥不存在于字典中;当键本身是一个类型时

本文关键字:类型 一个 字典 密钥 不存在 于字典 | 更新日期: 2023-09-27 18:25:41

这是我的代码:

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");

你能说出原因吗?非常感谢。

c#”;给定的密钥不存在于字典中;当键本身是一个类型时

当您使用一个类作为字典的键时,该类必须正确实现GetHashCode()和Equals:字典调用这两个方法来理解"那个键"answers"另一个键"是相同的:如果两个实例xyGetHashCode()x.Equals(y) == true;返回相同的值,则两个键匹配。

MyKeyType类中不提供这两个重写将导致在运行时调用object.GetHashCode()object.Equals:只有当x和y是对同一实例(即object.ReferenceEquals(x, y) == true)的引用时,它们才会返回匹配

许多.Net框架类型(例如字符串、数字类型、日期时间等)正确地实现了这两种方法。对于您定义的类,您必须在代码中实现它们

如果您能够使用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(); 
    }
相关文章: