此代码返回不同的值.但是,我想要的是返回强类型集合而不是匿名类型

Dar*_*ung 15 c# linq

我有以下代码:

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>实现.