c# - LINQ Distinct 与自定义 IEqualityComparer

标签 c# linq iequalitycomparer

所以,我有一个像这样的:

public History
{
    int ProcessedImageId;
    string UserId;
    DateTime TimeStamp;
    ...   
}

LINQ 查询中,我得到了某个时间范围内的所有 “历史记录”

现在,我还执行第二个查询以检索在多个日期Processed 的图像。

这个,工作正常。这是我得到的示例。

enter image description here

现在,我想要得到相同的查询,但不重复图像的 ID。因此,如果图像被多次处理,我将只获取第一次被修改的时间。

所以,这就是我正在尝试的:

#query holds the second query

var result = query.AsEnumerable().Distinct(new HistoryComparer());

而且,我的 HistoryComparer 看起来像这样:

public bool Equals(History x, History y)
{
    return x.ProcessedImageId == y.ProcessedImageId && x.TimeStamp != y.TimeStamp;
}

public int GetHashCode(History obj)
{
    return obj.TimeStamp.GetHashCode() ^ obj.ProcessedImageId.GetHashCode();
}

如您所见,我不关心日期。这就是为什么我在日期不同时返回 true 的原因。但是,这是行不通的。我仍然得到相同的结果。我能做什么?

谢谢

最佳答案

为了使相等比较器正常工作,除了比较项目本身的相等性之外,它还必须为它认为相同的事物生成相同的哈希码。您的代码存在两个实现问题,无法获得预期的结果。

您的实现的第一个问题是,当日期相同时,您声明历史记录不同:

public bool Equals(History x, History y) {
    return x.ProcessedImageId == y.ProcessedImageId && x.TimeStamp != y.TimeStamp;
    //                                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}

删除这部分将恢复相等比较逻辑。

但是,这还不够,因为您还必须处理哈希码。它必须停止在计算中使用时间戳:

public int GetHashCode(History obj) {
    return obj.ProcessedImageId.GetHashCode();
}

此时相等比较归结为比较 ID。

关于c# - LINQ Distinct 与自定义 IEqualityComparer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31879784/

相关文章:

c# - 与字符串统一设置下拉值

c# - ASP.Net Core 1 日志记录错误 - 无法找到来自源应用程序的事件 ID xxxx 的描述

c# - WPF,将代码直接放在InitializeComponent之后的错误做法?

c# - 多个数据库的 LINQ 查询 c#

c# - IEqualityComparer 使用 Except, Intersect

c# - 如何在 C# 中使用 EqualityComparer 返回 Distinct 中的特定项

c# - 如何根据值选择ItemTemplate?

c# - 如何创建动态 Entity Framework 过滤表达式,如 Expression<Func<T, bool>>

c# - parent 和 child 的 Linq 订单

.net - IStructuralEquatable 和 IStructuralComparable 解决什么问题?