Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ Distinct与自定义iQualityComparer_C#_Linq_Iequalitycomparer - Fatal编程技术网

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已经发布了。谢谢。我在第二个问题中遇到了问题。现在,它工作得很好。谢谢。我在第二个问题中遇到了问题。现在,它工作得很好。