我有以下代码:
var foo = (from data in pivotedData.AsEnumerable()
select new
{
Group = data.Field<string>("Group_Number"),
Study = data.Field<string>("Study_Name")
}).Distinct();
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这将返回不同 但是,我想要的是返回强类型集合而不是匿名类型,所以当我这样做时:
var foo = (from data in pivotedData.AsEnumerable()
select new BarObject
{
Group = data.Field<string>("Group_Number"),
Study = data.Field<string>("Study_Name")
}).Distinct();
Run Code Online (Sandbox Code Playgroud)
这不会返回不同的值,而是返回所有值.有没有办法用实际对象做到这一点?
Jam*_*are 12
对于Distinct()(和许多其他特征LINQ)工作,类进行比较(BarObject在你的例子)必须实现执行Equals()和GetHashCode(),或者备选地提供单独IEqualityComparer<T>作为参数Distinct().
许多LINQ方法都利用GetHashCode()了性能,因为在内部它们将使用诸如a之类的东西Set<T>来保存唯一的项目,这些项目使用哈希进行O(1)查找.此外,GetHashCode()可以迅速告诉你,如果两个物体可能是等价的,哪些是绝对不会-只要GetHashCode()是当然的正确实施.
因此,您应该在LINQ实现Equals()和GetHashCode()完整性中创建要比较的所有类,或者创建单独的IEqualityComparer<T>实现.