如何使用不同的键实例来检索字典中的值
本文关键字:检索 字典 何使用 实例 | 更新日期: 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();
}
}
由于KeyClass
是class
,因此在创建新对象(具有不同的引用)时找不到键,即使它们的属性相同。现在有几个选项:
- 为
KeyClass
覆盖.Equals
,因此您的两个对象实例被视为相同的并且可以找到键。 -
不是创建一个新的
KeyClass
实例,而是从密钥集合中获取它:var key = dic.Keys。SingleOrDefault(p => p. key == "k1");
-
如果可能的话,将
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;
}