我正在查询名为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个值上使用distinct? (因为如果只是STUDENT_ID它会进行排序)我希望它显示STUDENT_ID的唯一值并显示相应的TIMES。
OR .. 2.如何制作一个有效的Comparer?我收到以下错误。
一个。错误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
℃。错误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
答案 0 :(得分: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;