如果我想使用对象作为Dictionary的键,我需要重写哪些方法以使其以特定方式进行比较?

说我有一个具有属性的类:

class Foo {
    public string Name { get; set; }
    public int FooID { get; set; }

    // elided
}

我想创建一个:
Dictionary<Foo, List<Stuff>>

我希望具有相同FooFooID对象被视为同一组。我需要在Foo类中重写哪些方法?

总结一下:我想将Stuff对象分类为列表,并按Foo对象分组。 Stuff对象将具有一个FooID将它们链接到其类别。

最佳答案

默认情况下,两个重要方法是GetHashCode()Equals()。重要的是,如果两个条件相等(Equals()返回true),则它们具有相同的哈希码。例如,您可以“返回FooID;”。如果您希望将其作为GetHashCode()进行匹配。您也可以实现IEquatable<Foo>,但这是可选的:

class Foo : IEquatable<Foo> {
    public string Name { get; set;}
    public int FooID {get; set;}

    public override int GetHashCode() {
        return FooID;
    }
    public override bool Equals(object obj) {
        return Equals(obj as Foo);
    }
    public bool Equals(Foo obj) {
        return obj != null && obj.FooID == this.FooID;
    }
}

最后,另一种选择是提供IEqualityComparer<T>来执行相同的操作。

09-28 09:12