【问题标题】:Dictionary: Find same value using different but identical instances as keys [duplicate]字典:使用不同但相同的实例作为键查找相同的值[重复]
【发布时间】:2015-09-03 20:50:15
【问题描述】:

是否有可能以方便的方式从字典中实现以下行为:

Dictionary<MyObject, double> d = new Dictionary<MyObject, double>
MyObject foo = new MyObject("foo");
d[foo] = 1.0;

Console.Write(d[new MyObject("foo")]) ---> 1.0

这个例子被简化了,我使用了一个稍微复杂的对象作为key。

用 MyObject 编辑替换的字符串

【问题讨论】:

  • 我不明白,不同但相同的实例?您的代码按预期工作。它打印1
  • string 它将正常工作(“开箱即用”)...对于其他对象类型,您必须覆盖GetHashCodeEquals
  • 它是不同的字符串,但内容相同。 new MyObject() == new MyObject() --> False
  • 通常你会这样做if (!d.ContainsKey(foo)) { d.Add(foo, 0) } d[foo] = 1.0;
  • @CallumLinington:为什么? OP 的方法效率更高。

标签: c# dictionary


【解决方案1】:

是的,这是可能的,只要您的键对应的Equals() 方法返回true,并且GetHashCode() 为您调用的different but identical instances 返回相同的整数值。

在您的示例中,结果为 1.0,因为 String.Equals 比较的是字符串的内容,而不是引用(尽管准确地说,您的示例中的引用很可能也是相同的,因为编译器通常会汇集相同的字符串) . 编辑:本段适用于原始问题,其中 OP 使用 string 作为键。

如果您对键使用自定义类,只需覆盖其Equals 方法即可实现所需的行为。不要忘记覆盖GetHashCode() 以实现高效的字典查找,请参阅此推理:Why is it important to override GetHashCode when Equals method is overridden?

【讨论】:

  • 谢谢,我的 GetHashCode 实现一定是出错了。我会做一些测试:)
  • 始终覆盖Equals GetHashCode。您还可以实现IEquatable&lt;MyObject&gt;IEqualityComparer&lt;MyObject&gt;。前者隐式工作,后者使用this dictionary constructor
  • @Tim Schmelter,说得好,重新表述了我的回答以包含您的建议
猜你喜欢
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
相关资源
最近更新 更多