使用带公差的IEqualityComparer GetHashCode

我试图实现一个IEqualityComparer ,它在日期比较上有一个容差。 我也研究过这个问题。 问题是我无法使用解决方法,因为我在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() .GroupJoin()构建HashTable时,它将应用日期添加到两个/所有对象。 这不起作用。


概念上,这个问题是不可能的。 您试图以一种不具有您尝试执行的操作所需的平等形式的方式比较对象。 例如, GroupJoin取决于如下假设:如果A等于B,B等于C,那么A等于C,但在你的情况下,情况并非如此。 A和B可能“足够接近”在一起,因为你想分组它们,但A和C可能不一样。

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


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

如果你的“float”是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)。

1/1/2000和1/8/2000在5天“浮动”之外。

链接地址: http://www.djcxy.com/p/39747.html

上一篇: Using IEqualityComparer GetHashCode with a tolerance

下一篇: Comparison via Equals or HashCode. which is faster?