c# - 此代码返回不同的值。但是,我想要的是返回一个强类型集合而不是匿名类型

标签 c# linq

我有以下代码:

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/

相关文章:

c# - 如何从 asp :Dropdownlist on Page load from Code Behind C#? 中选择一个项目

c# - 根据程序内存查找新地址

c# - 在 LINQ WHERE 子句中有条件地允许 null

LINQ - 不存在的地方

c# - 打开在 C# 中创建的 OpenXML Word 文档时未应用图像大小

c# - Elasticsearch.net NEST Bool查询未生成预期的请求

C# LINQ 选择具有相同属性值的对象加入其他属性值

c# - 使用 LINQ 获取嵌套多个级别的子实体列表

c# - 如何调试 dotnet ef 数据库删除?

c# - LINQ:根据属性值从 XML 中删除元素?