我有以下代码:
var foo = (from data in pivotedData.AsEnumerable()
select new
{
Group = data.Field<string>("Group_Number"),
Study = data.Field<string>("Study_Name")
}).Distinct();
正如预期的那样,这将返回不同的值。但是,我想要的是返回一个强类型集合而不是匿名类型,所以当我这样做时:
var foo = (from data in pivotedData.AsEnumerable()
select new BarObject
{
Group = data.Field<string>("Group_Number"),
Study = data.Field<string>("Study_Name")
}).Distinct();
这不会返回不同的值,它会返回所有值。有没有办法对实际对象执行此操作?
最佳答案
对于 Distinct()
(以及许多其他 LINQ 功能)工作,被比较的类(在您的示例中为 BarObject
)必须实现 implement Equals()
和 GetHashCode()
,或者提供单独的 IEqualityComparer<T>
作为 Distinct()
的参数.
许多 LINQ 方法利用 GetHashCode()
为了性能,因为在内部他们会使用类似 Set<T>
的东西保存唯一项,它使用散列进行 O(1) 查找。另外,GetHashCode()
可以快速告诉您两个对象可能是否等价,哪些绝对不等价-只要GetHashCode()
当然是正确实现。
所以你应该让所有你打算在 LINQ 实现中比较的类 Equals()
和 GetHashCode()
为了完整性,或创建一个单独的 IEqualityComparer<T>
实现。
关于c# - 此代码返回不同的值。但是,我想要的是返回一个强类型集合而不是匿名类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7336275/