使用带有容差的IEqualityComparer GetHashCode

我正在尝试实现一个对日期比较具有容差的IEqualityComparer 。 我也研究了这个问题 。 问题是我无法使用变通方法,因为我在LINQ .GroupJoin()使用IEqualityComparer 。 我尝试了一些允许容忍的实现。 我可以让Equals()工作,因为我有两个对象,但我无法弄清楚如何实现GetHashCode()

我最好的尝试看起来像这样:

 public class ThingWithDateComparer : IEqualityComparer { private readonly int _daysToAdd; public ThingWithDateComparer(int daysToAdd) { _daysToAdd = daysToAdd; } public int GetHashCode(IThingWithDate obj) { unchecked { var hash = 17; hash = hash * 23 + obj.BirthDate.AddDays(_daysToAdd).GetHashCode(); return hash; } } public bool Equals(IThingWithDate x, IThingWithDate y) { throw new NotImplementedException(); } } public interface IThingWithDate { DateTime BirthDate { get; set; } } 

使用.GroupJoin()GetHashCode() .GroupJoin()构建HashTable ,它将应用添加到两个/所有对象的天数。 这不起作用。

从概念上讲,问题是不可能的。 您试图以一种方式比较对象,这种方式没有您尝试使用它执行的操作所必需的相等forms。 例如, GroupJoin依赖于这样的假设:如果A等于B,并且B等于C,则A等于C,但在您的情况下,这不是真的。 A和B可以“足够接近”,以便您想要对它们进行分组,但A和C可能不是。

您根本不需要实现IEqualityComparer ,因为您无法履行它所需的合同。 如果你想创建一个集合中的项目映射到另一个集合中与其足够“接近”的所有项目,那么你将需要自己编写该算法(这样做有效可能很难,但这样做效率不高并不应该“那么困难”,而不是使用GroupJoin ,因为它无法执行该操作。

我看不到为您的给定条件生成逻辑哈希码的任何方法。
哈希码用于确定两个日期是否应该粘在一起。 如果它们应该组合在一起,那么它们必须返回相同的哈希码。

如果你的“浮动”是5天,那意味着1/1/2000必须生成与1/4/2000相同的哈希码,而1/4/2000必须生成与1/8/2000相同的哈希码(因为它们两者都在5天之内)。 这意味着1/1/2000具有与1/8/2000相同的代码(因为如果a = b且b = c,则a = c)。

2000年1月1日和1/8/2000超出5天“浮动”。