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。
所以,我有一个 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。