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
如何在LINQ中使用Distinct()以及如何传递自己的比较器_Linq_Distinct_Icomparer_Distinct Values - Fatal编程技术网

如何在LINQ中使用Distinct()以及如何传递自己的比较器

如何在LINQ中使用Distinct()以及如何传递自己的比较器,linq,distinct,icomparer,distinct-values,Linq,Distinct,Icomparer,Distinct Values,我正在查询一个名为STUDENT的表。我想检索两个值,STUDENT_ID和TIME(都是字符串)。但是,我只需要STUDENT_ID的不同值。当我仅对STUDENT_ID使用distinct()时,我会得到唯一的值。但是当我把时间包括进来的时候,所有的值都显示出来了,因为表中的时间都不一样。我还尝试创建自己的比较器类,并将实例传递给Distinct() 公共类MyCompare:IEqualityComparer { 公共布尔等于(数据行x、数据行y) { 返回(x字段(“学生ID”)==y字

我正在查询一个名为STUDENT的表。我想检索两个值,STUDENT_ID和TIME(都是字符串)。但是,我只需要STUDENT_ID的不同值。当我仅对STUDENT_ID使用distinct()时,我会得到唯一的值。但是当我把时间包括进来的时候,所有的值都显示出来了,因为表中的时间都不一样。我还尝试创建自己的比较器类,并将实例传递给Distinct()

公共类MyCompare:IEqualityComparer
{
公共布尔等于(数据行x、数据行y)
{
返回(x字段(“学生ID”)==y字段(“学生ID”);
}
public int GetHashCode(DataRow obj)
{
返回obj.ToString().GetHashCode();
}
}
但是,我有4个错误

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

或者。。 2.如何制作一个工作比较器?我得到以下错误

a。错误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

b。错误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

您的比较器应该真正实现
IEqualityComparer
-它正在比较行,不是整个问题

但是,一旦修复了这个问题,您的
GetHashCode
方法仍然会被破坏-它将返回行本身的
ToString
调用结果的散列,而不仅仅是使用STUDENT\u ID字段。如果
ToString
为行中的所有字段提供了一个合理的字符串表示,那么它将被完全破坏。如果它实际上只是返回类名(这是
ToString
的默认行为),那么它是无用的,而不是被破坏的:)您应该使用如下内容:

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

我希望您知道,当您实现类似的comparer时,它将返回不同的student id值和radom时间值(找到的第一条记录),您应该首先获得不同的StudentID,然后查询集合中的所有时间值。实际上OP当前的GetHashCode实现将始终返回相同的值,因为他正在调用
.ToString().GetHashCode()
ToString
返回“System.Data.DataRow”)。所以它不是真的坏了(它不会为相等的行返回不同的值),它只是效率很低。。。
public int GetHashCode(DataRow row)
{
    string id = row.Field<string>("STUDENT_ID");
    return id == null ? 0 : id.GetHashCode();
}
// Compute hashes for field1 and field2
...
int hash = 17;
hash = hash * 31 + hashForField1;
hash = hash * 31 + hashForField2;
return hash;