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

假设我有一个具有属性的类:

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

    // elided
} 

我想创造一个:

Dictionary<Foo, List<Stuff>>

我希望Foo个具有相同FooID的对象被视为同一组.我需要在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;
    }
}

最后,另一种 Select 是提供一个IEqualityComparer<T>来做同样的事情.

.net相关问答推荐

如何在dotnet中使用OpenTelemetry Prometheus导出器导出多个版本的度量?

无法通过构建目标访问 dotnet 的环境变量

如何知道变量是否只是指向另一个对象的pointer或者它是否可以独立存在

在 .NET C# 中存储加密密钥的最佳方式

如何从 appsettings.json 中获取价值

为什么 C# 多维数组不实现 IEnumerable

.NET - 实现捕获所有异常处理程序的最佳方法是什么

Int 到字节数组

DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") 返回上午时间而不是下午时间?

实体框架 - 无法将 lambda 表达式转换为类型字符串,因为它不是委托类型

如何从 .NET 中的流中获取 MemoryStream?

WCF服务客户端:内容类型text/html;响应消息的charset=utf-8 与绑定的内容类型不匹配

析构函数、dispose 和 finalize 方法的区别

log4net的正确使用方法(记录器命名)

获取系统中已安装的应用程序

DateTime.Compare 如何判断日期是否小于 30 天?

MemoryCache 不遵守配置中的内存限制

/langversion 的错误选项6无效;必须是 ISO-1、ISO-2、3、4、5 或默认值

记录器包装器最佳实践

C# ListView 列宽自动