【发布时间】:2021-03-17 18:58:20
【问题描述】:
我想使用一个日期范围(从一个日期到另一个日期)作为字典的键,所以我编写了自己的结构:
struct DateRange
{
public DateTime Start;
public DateTime End;
public DateRange(DateTime start, DateTime end)
{
Start = start.Date;
End = end.Date;
}
public override int GetHashCode()
{
// ???
}
}
实现 GetHashCode 的最佳方法是什么,这样不同范围的两个对象都不会生成相同的哈希?我希望哈希冲突尽可能地降低,尽管我理解 Dictionary 仍会检查我还将实现的相等运算符,但不想过多地污染示例代码。谢谢!
【问题讨论】:
-
也许这对你很感兴趣 - GetHashCode 的一个非常好的介绍:blogs.msdn.com/b/ericlippert/archive/2011/02/28/…
-
除了 GetHashCode:可变结构和公共字段通常都是一个坏主意。
-
你认为我应该改用
public DateTime Start { get; set; }的课程吗? -
不,您不应该允许字段发生变异根本。将它们设为
private和readonly,通过构造函数设置它们(就像你已经做的那样),并为这些字段提供只读的“get”属性。 -
@johnny5:公共字段通常公开类型的实现,而不是要使用的 API 表面。偶尔它是合适的 - 例如。 ValueTuple - 但通常不会。