我正在尝试实现一个对日期比较具有容差的 IEqualityComparer
。我也调查了this question .问题是我无法使用解决方法,因为我在 LINQ .GroupJoin()
中使用 IEqualityComparer
。我已经尝试了一些允许容忍的实现。我可以让 Equals()
工作,因为我有两个对象,但我不知道如何实现 GetHashCode()
。
我最好的尝试是这样的:
public class ThingWithDateComparer : IEqualityComparer<IThingWithDate>
{
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()
构建一个 HashTable
,它应用天数添加到两个/所有对象。这行不通。
最佳答案
这个问题在概念上是不可能的。您正在尝试以一种不具有您尝试对其执行的操作所必需的相等形式的方式来比较对象。例如,GroupJoin
依赖于这样的假设:如果 A 等于 B,并且 B 等于 C,则 A 等于 C,但在您的情况下,这是不正确的。 A 和 B 可能靠得“足够近”以至于您想将它们分组,但 A 和 C 可能不是。
您根本不需要实现 IEqualityComparer
,因为您无法履行它所要求的契约(Contract)。如果你想创建一个集合中的项目到另一个集合中与其“足够接近”的所有项目的映射,那么你将需要自己编写该算法(高效地这样做可能很困难,但低效地这样做并不应该那么困难),而不是使用 GroupJoin
,因为它不能执行该操作。
关于c# - 使用具有公差的 IEqualityComparer GetHashCode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41492345/