C# LINQ Distinct与自定义iQualityComparer
所以,我有一节课是这样的:C# LINQ Distinct与自定义iQualityComparer,c#,linq,iequalitycomparer,C#,Linq,Iequalitycomparer,所以,我有一节课是这样的: public History { int ProcessedImageId; string UserId; DateTime TimeStamp; ... } public bool Equals(History x, History y) { return x.ProcessedImageId == y.ProcessedImageId && x.TimeStamp != y.TimeStamp; }
public History
{
int ProcessedImageId;
string UserId;
DateTime TimeStamp;
...
}
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();
}
通过LINQ查询,我得到了一段时间内的所有历史记录
现在,我还要执行第二个查询来检索在多个日期处理的图像
这个很好用。这是我得到的一个例子
现在,我希望得到相同的查询,但不重复图像的ID。因此,如果一个图像被多次处理,我只会得到第一次修改
所以,这就是我正在尝试的:
#query holds the second query
var result = query.AsEnumerable().Distinct(new HistoryComparer());
我的历史比较器如下所示:
public History
{
int ProcessedImageId;
string UserId;
DateTime TimeStamp;
...
}
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。为了使相等性比较器正确工作,除了比较相等项本身之外,它还必须为其认为相同的项生成相同的哈希代码。您的代码存在两个实现问题,无法获得预期的结果 实现的第一个问题是,当日期相同时,您会声明不同的历史记录:
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。您实现相等的方式是x.Equalsx==false,这是不对的,那么我该怎么做呢?忽略时间戳即可。事实上dasblinkenlight已经发布了。以等于的方式实现了x.Equalsx==false,这是不对的,那么我该怎么做呢?忽略时间戳就行了。事实上dasblinkenlight已经发布了。谢谢。我在第二个问题中遇到了问题。现在,它工作得很好。谢谢。我在第二个问题中遇到了问题。现在,它工作得很好。