LINQ Distinct 与自定义 IEqualityComparer

LINQ Distinct with custom IEqualityComparer

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

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

LINQ 查询中,我得到了一段时间内的每个 "History"

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

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

现在,我想要得到同样的查询,but without repeating the ID of the image。所以,如果一个图像被多次处理,我将只获取第一次被修改的。

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

#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();
}

如您所见,I don't care about the date。这就是为什么如果日期不同,我返回 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。