C#如何覆盖字典ContainsKey 公开课日期 { 公共int mm; 公共int dd; 公开日期(int get\u mm,int get\u dd) { mm=获得_mm; dd=获取_dd; } } 公共字典=新字典(); 日期A=新日期(1,1) 日期B=新日期(1,1) 增加(A,1); if(dictionary.ContainsKey(B))//返回false ...

C#如何覆盖字典ContainsKey 公开课日期 { 公共int mm; 公共int dd; 公开日期(int get\u mm,int get\u dd) { mm=获得_mm; dd=获取_dd; } } 公共字典=新字典(); 日期A=新日期(1,1) 日期B=新日期(1,1) 增加(A,1); if(dictionary.ContainsKey(B))//返回false ...,c#,dictionary,overriding,C#,Dictionary,Overriding,在这种情况下,如何重写Date类? 我知道这两个对象是不同的,但不知道如何使其工作您有两种方法: 通过重写class Date的GetHashCode和Equals方法 使用接受一个IEqualityComparer作为参数的Dictionary构造函数 如果Date对象不是不可变的(即,在创建后不能修改其属性=>Date属性需要是只读的),则不建议使用第一种方法。因为Dictionary类在插入时基于GetHashCode值构建其内部结构。如果用于计算GetHashCode的属性发生更改,

在这种情况下,如何重写Date类? 我知道这两个对象是不同的,但不知道如何使其工作

您有两种方法:

  • 通过重写class Date的
    GetHashCode
    Equals
    方法
  • 使用接受一个
    IEqualityComparer
    作为参数的
    Dictionary
    构造函数

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

您需要覆盖
Date
Equals
GetHashCode
方法。或者,您可以创建一个
IEqualityComparer
传递给字典,告诉它如何比较
Date
obejcts。最好的方法是使用自定义相等比较器制作字典。为什么要从示例中获取对象B而不是对象A?A+B共享相同的值,为什么要保存两次?@user743414这只是一个例子。我只是想反映一下我的想法problem@gaborbozo这就是为什么我问你想做什么。
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
...