如何使用不同的键实例来检索字典中的值

本文关键字:检索 字典 何使用 实例 | 更新日期: 2023-09-27 18:02:42

我想使用一个键(从具有相同属性的新实例)来检索值。但是它会得到KeyNotFoundException

class Program
{
    static void Main(string[] args)
    {
        Dictionary<Keyclass, ValueClass> dic = new Dictionary<Keyclass, ValueClass>()
        {
            { new Keyclass() { Key = "k1" }, new ValueClass() {Value = "v1"} },
            { new Keyclass() { Key = "k2" }, new ValueClass() {Value = "v2"} }
        };
        var key = new Keyclass() { Key = "k1" };
        var value = dic[key];
    }
}
 public class Keyclass
{
     public string Key { get; set; }
}
public class ValueClass
{
    public string Value { get; set; }
}

如何使用不同的键实例来检索字典中的值

字典使用对象。等号和对象。GetHashCode来比较键,所以你需要在你的键类中实现这些键,或者为字典构造函数提供一个IEqualityComparer实现。

public class Keyclass
{
    public string Key { get; set; }
    public override bool Equals(object other)
    {
      var otherKeyClass = other as Keyclass;
      return (otherKeyClass != null) && (otherKeyClass.Key == Key);
    }
    public override int GetHashCode()
    {
      return Key.GetHashCode();
    }
}

由于KeyClassclass,因此在创建新对象(具有不同的引用)时找不到键,即使它们的属性相同。现在有几个选项:

  1. KeyClass覆盖.Equals,因此您的两个对象实例被视为相同的并且可以找到键。
  2. 不是创建一个新的KeyClass实例,而是从密钥集合中获取它:

    var key = dic.Keys。SingleOrDefault(p => p. key == "k1");

  3. 如果可能的话,将KeyClass定义为struct而不是class

首先,为什么不使用Dictionary<string,string>而使用包装字符串?

第二,如果你真的想使用包装器类,你必须告诉包装器类如何通过重写Equals(Keyclass obj)和GetHashCode()方法来比较它的两个实例:

              public override bool Equals(object obj)
                {
                  return this.Key == ((KeyClass)obj).Key;
                }

       public override int GetHashCode()
         {
           int hash = 17;
           hash = hash * 23 + Key.GetHashCode();
           return hash;
         }