c# - 使用具有公差的 IEqualityComparer GetHashCode

标签 c# linq hashtable date-range iequalitycomparer

我正在尝试实现一个对日期比较具有容差的 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/

相关文章:

c# - 带有嵌套列表的 TreeView

entity-framework - EF Core 2.1.2 和 .net core 2.0 - Linq2Entities 导致 'must be reducible node' 错误

java - HQL 中的 Linq ".any"等价物

c++ - 哈希表不接受传递给成员初始化列表中的构造函数的函数

c - 使用读/写函数在 C 中调整哈希表大小

java - java 如何管理会导致其性能不佳的 HashMap 大小分配?

c# - "The maximum message size quota for incoming messages (65536) has been exceeded."。即使在设置更大的尺寸之后

c# - 是否有任何附加组件/扩展可以让我在 Visual Studio 中使用 F12 存储过程?

c# - C# 中的蓝牙库

c# - 有没有一种简单的方法可以通过非交换操作进行并行聚合?