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

C# 如何使用键的不同实例检索字典中的值,c#,C#,我想使用具有相同属性的新实例中的键来检索值。但它会得到KeyNotFoundException class Program { static void Main(string[] args) { Dictionary<Keyclass, ValueClass> dic = new Dictionary<Keyclass, ValueClass>() { { new Keyclass() { Key =

我想使用具有相同属性的新实例中的键来检索值。但它会得到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; }
}

首先,为什么不使用字典而不是包装字符串

第二,如果您真的想使用包装器类,您必须告诉包装器类如何通过重写EqualskyClass 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;
         }

首先,为什么不使用字典而不是包装字符串

第二,如果您真的想使用包装器类,您必须告诉包装器类如何通过重写EqualskyClass 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;
         }
字典使用和来比较键,因此您需要实现键类中的键,或者为字典构造函数提供实现

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();
    }
}
字典使用和来比较键,因此您需要实现键类中的键,或者为字典构造函数提供实现

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();
    }
}
由于KeyClass是一个类,因此在创建具有不同引用的新对象时找不到该键,即使它们的属性相同。现在有几种选择:

Overwrite.Equals用于KeyClass,因此您的两个对象实例被视为相同的,并且可以找到密钥。 不要创建新的KeyClass实例,而是从密钥集合获取它:

var key=dic.Keys.SingleOrDefaultp=>p.key==k1

如果可能,将KeyClass定义为结构而不是类。当所有属性相等时,结构被视为相等

由于KeyClass是一个类,因此在创建具有不同引用的新对象时找不到该键,即使它们的属性相同。现在有几种选择:

Overwrite.Equals用于KeyClass,因此您的两个对象实例被视为相同的,并且可以找到密钥。 不要创建新的KeyClass实例,而是从密钥集合获取它:

var key=dic.Keys.SingleOrDefaultp=>p.key==k1

如果可能,将KeyClass定义为结构而不是类。当所有属性相等时,结构被视为相等


向上投票:当所有属性都相等时,结构被认为是相等的-你能再告诉我一点吗?如果你重写,你也需要重写GetHashCodeEquals@NewtonSheikh考虑一个结构向量{public int x;public int y;}。如果有var vec1=new Vector{X=1,Y=2}和var vec2=new Vector{X=1,Y=2},那么vec1==vec2将返回true,因为字段具有相同的值,这在使用类时是不正确的,除非覆盖Equals。向上投票:当所有属性都相等时,结构被认为是相等的-你能再给我一点启发吗?如果覆盖,你也需要覆盖GetHashCodeEquals@NewtonSheikh考虑一个结构向量{public int x;public int y;}。如果您有var vec1=new Vector{X=1,Y=2}和var vec2=new Vector{X=1,Y=2},那么vec1==vec2将返回true,因为字段具有相同的值,除非您覆盖Equals,否则在使用类时不是true。可以假设OP将扩展KeyClass或将其用作一个简单的示例。我也不能让你的答案起作用,因为没有Equals方法可以重写,它的参数是Keyclass obj。Equals参数应该是一个对象,然后你将其强制转换为KeyClassic如果我在Keyclass中有许多属性,GetHashCode是如何以同样的方式实现的?是的,你是对的,Equals应该将object作为param,我编辑了它@Charla检查一下:假设OP将扩展KeyClass,或者将其用作一个简单的示例。我也不能让你的答案起作用,因为没有Equals方法可以重写,它的参数是Keyclass obj。Equals参数应该是一个对象,然后你将其强制转换为KeyClassic如果我在Keyclass中有许多属性,GetHashCode是如何以同样的方式实现的?是的,你是对的,Equals应该将object作为param,我编辑了它@Charla查看:谢谢你的建议。无论如何,这是一个简单的例子,涉及到我的复杂键类。为什么如果KeyClass包含许多属性10+,有没有有效的方法重写GetHashCode或等效项?谢谢你的建议。无论如何,这是一个简单的例子,涉及到我的复杂键类。为什么如果KeyClass包含许多属性10+,有没有有效的方法重写GetHashCode或相等的属性?