linq - 如何将自定义比较器与 Linq Distinct 方法一起使用?

标签 linq distinct icomparer

我在读一本关于 Linq 的书,看到 Distinct 方法有一个需要比较器的重载。这将是一个很好的解决方案,我想从集合中获取不同的实体,但希望在实体 ID 上进行比较,即使其他属性不同。

根据这本书,如果我有一个 Gribulator 实体,我应该能够创建一个像这样的比较器......

private class GribulatorComparer : IComparer<Gribulator> {
  public int Compare(Gribulator g1, Gribulator g2) {
    return g1.ID.CompareTo(g2.ID);
  }
}

...然后像这样使用它...
List<Gribulator> distinctGribulators
  = myGribulators.Distinct(new GribulatorComparer()).ToList();

但是,这会产生以下编译器错误...

“System.Collections.Generic.List”不包含“Distinct”的定义和最佳扩展方法重载“System.Linq.Enumerable.Distinct(System.Collections.Generic.IEnumerable, System.Collections.Generic.IEqualityComparer)”有一些无效的论点

参数 2:无法从 'LinqPlayground.Program.GribulatorComparer' 转换为 'System.Collections.Generic.IEqualityComparer'

我搜索了一下,看到了很多使用这样的代码的例子,但没有关于编译器错误的提示。

我究竟做错了什么?另外,这是最好的方法吗?我想要一个一次性的解决方案,所以不想开始更改实体本身的代码。我希望实体保持正常,但就在这个地方,仅按 ID 进行比较。

谢谢你的帮助。

最佳答案

您将比较器实现为 IComparer<T> ,LINQ 方法重载需要 IEqualityComparer 的实现:

private class GribulatorComparer : IEqualityComparer<Gribulator> {
  public bool Equals(Gribulator g1, Gribulator g2) {
    return g1.ID == g2.ID;
  }
}

编辑:

为澄清起见,IComparer接口(interface)可用于排序,因为这基本上是 Compare()方法可以。

像这样:
items.OrderBy(x => new ItemComparer());

private class ItemComparer : IComparer<Item>
{
    public int Compare(Item x, Item y)
    {
        return x.Id.CompareTo(y.Id)
    }
}

这将使用该比较器对您的集合进行排序,但是 LINQ 为简单字段(如 int Id)提供了一种方法。
items.OrderBy(x => x.Id);

关于linq - 如何将自定义比较器与 Linq Distinct 方法一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13331985/

相关文章:

MYSQL 选取每个日期的最晚时间

c# - 在 List<T>.Sort() 方法中,项目是否与自身进行了比较?

c# - 在 C# 中使用 IComparer<T>.Compare(T,T)

c# - 您能否使用 linq 查看两个 IEnumerables 数据是否包含任何公共(public)条目?

c# - 什么时候返回延迟的 IEnumerable<T> 是错误的形式

c# - 如何从列表中的列表中检索不同值的列表

C# 使用 IComparer 对 x 列进行排序

linq - LINQtoSQL 中区分大小写的 Where 子句?

c# - 事务和 TransactionScope 隔离

sql - PostgreSQL - 选择条件满足的不同(列1,列2)