0

我正在查询一个名为 STUDENT 的表。我想检索 2 个值,即 STUDENT_ID 和 TIME(两者都是字符串)。但是,我只想要 STUDENT_ID 的不同值。当我使用只有 STUDENT_ID 的 Distinct() 时,我确实得到了唯一值。但是在我包含 TIME 的那一刻,所有的值都会显示出来,因为表中的时间都是不同的。我还尝试创建自己的 Comparer 类,并将一个实例传递给 Distinct()。

  public class MyCompare : IEqualityComparer<IQueryable>
{

    public bool Equals(DataRow x, DataRow y)
    {
        return (x.Field<string>("STUDENT_ID") == y.Field<string>("STUDENT_ID"));
    }

    public int GetHashCode(DataRow obj)
    {
        return obj.ToString().GetHashCode();
         }


}

但是,我得到 4 个错误。

1)。有没有办法在 2 个值上使用不同的值?(因为如果它只是 STUDENT_ID 它会排序)我希望它显示 STUDENT_ID 的唯一值并显示相应的 TIMES。

或者.. 2. 我如何制作一个有效的比较器?我收到以下错误。

一个。错误 1 ​​'System.Linq.IQueryable' 不包含 'Distinct' 的定义,并且最佳扩展方法重载 'System.Linq.ParallelEnumerable.Distinct(System.Linq.ParallelQuery, System.Collections.Generic.IEqualityComparer)' 有一些无效参数 C:\Users\KC\Desktop\SoulScanner\SoulScanner\SearchByTime.xaml.cs 360 23 SoulScanner

湾。错误 4 参数 1:无法从 'System.Collections.Generic.IEnumerable' 转换为 'System.Linq.IQueryable' C:\Users\KC\Desktop\SoulScanner\SoulScanner\SearchByTime.xaml.cs 363 43 SoulScanner

C。错误 2 实例参数:无法从 'System.Linq.IQueryable' 转换为 'System.Linq.ParallelQuery' C:\Users\KC\Desktop\SoulScanner\SoulScanner\SearchByTime.xaml.cs 360 23 SoulScanner

d。错误 3 'SoulScanner.dgvRecords.dgvRecords(System.Linq.IQueryable)' 的最佳重载方法匹配有一些无效参数 C:\Users\KC\Desktop\SoulScanner\SoulScanner\SearchByTime.xaml.cs 363 28 SoulScanner

4

1 回答 1

2

您的比较器应该真正实现IEqualityComparer<DataRow>- 它是比较行,而不是整个查询。

但是,一旦修复了该问题,您的GetHashCode方法仍然被破坏 - 它返回ToString行本身的调用结果的哈希值,而不仅仅是使用 STUDENT_ID 字段。如果ToString想出行中所有字段的合理字符串表示,它将被完全破坏。如果它实际上只是返回类名(这是 的默认行为ToString),那么它是无用的,而不是损坏的:) 你应该使用这样的东西:

public int GetHashCode(DataRow row)
{
    string id = row.Field<string>("STUDENT_ID");
    return id == null ? 0 : id.GetHashCode();
}

如果您想区分两个值,则需要在哈希和相等比较中使用这两个值,仅此而已。您的相等比较将有两个相等检查,并且只有在两者都通过时才返回 true。哈希码方法可能会获得两个哈希(每个字段一个)并将它们组合在一起,例如

// Compute hashes for field1 and field2
...
int hash = 17;
hash = hash * 31 + hashForField1;
hash = hash * 31 + hashForField2;
return hash;
于 2011-03-31T08:45:08.877 回答