繁体   English   中英

使用具有公差的IEqualityComparer GetHashCode

[英]Using IEqualityComparer GetHashCode with a tolerance

我正在尝试实现对日期比较有容忍的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个日期是否应该在一起。 如果它们应该组合在一起,则必须返回相同的哈希码。

如果您的“浮动时间”为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天“浮动”期间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM