【问题标题】:C# How to override Dictionary ContainsKey [duplicate]C#如何覆盖字典包含键[重复]
【发布时间】:2020-03-26 13:11:06
【问题描述】:
public class Date
{
    public int mm;
    public int dd;

    public Date(int get_mm, int get_dd)
    {
        mm = get_mm;
        dd = get_dd;
    }
}

public Dictionary<Date, int> dictionary = new Dictionary<Date, int>();

Date A = new Date(1,1)
Date B = new Date(1,1)

dictionary.Add(A,1);
if(dictionary.ContainsKey(B)) //returns false
...

在这种情况下如何覆盖 Date 类? 我知道这两个对象不一样,但不知道如何使它工作

【问题讨论】:

  • 你需要重写DateEqualsGetHashCode方法。或者您可以创建一个IEqualityComparer&lt;Date&gt; 传递给字典,告诉它如何比较Date 对象。
  • 最好的方法是使用自定义相等比较器制作字典。 Check this
  • 为什么你想从你的例子中获取对象 B 而不是对象 A? A + B 共享相同的值,为什么要保存两次?
  • @user743414 这只是一个例子。我只是想反映我的问题
  • @gaborbozo 这就是我问你要做什么的原因。

标签: c# dictionary overriding


【解决方案1】:

你有两种方法:

  • 通过覆盖 Date 类的 GetHashCodeEquals 方法。
  • 通过使用接受一个IEqualityComparer&lt;Key&gt; 作为参数的Dictionary 构造函数。

如果您的Date 对象不是不可变的(即其属性在创建后无法修改=> Date 属性必须为readonly),则不建议使用第一种方法。因为 Dictionary 类在插入时基于GetHashCode 值构建其内部结构。如果用于计算 GetHashCode 的属性发生变化,您将无法检索已插入字典中的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多