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