Avr*_*oel 11 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);
}
}
Run Code Online (Sandbox Code Playgroud)
......然后像这样使用它......
List<Gribulator> distinctGribulators
= myGribulators.Distinct(new GribulatorComparer()).ToList();
Run Code Online (Sandbox Code Playgroud)
但是,这会给出以下编译器错误...
'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进行比较.
谢谢你的帮助.
小智 16
您将比较器实现为IComparer<T>,LINQ方法重载需要实现IEqualityComparer:
private class GribulatorComparer : IEqualityComparer<Gribulator> {
public bool Equals(Gribulator g1, Gribulator g2) {
return g1.ID == g2.ID;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
为了澄清,IComparer界面可以用于排序,因为这基本上是Compare()方法的作用.
像这样:
items.OrderBy(x => new ItemComparer());
private class ItemComparer : IComparer<Item>
{
public int Compare(Item x, Item y)
{
return x.Id.CompareTo(y.Id)
}
}
Run Code Online (Sandbox Code Playgroud)
这将使用该比较器对您的集合进行排序,但LINQ为简单字段(如int Id)提供了一种方法.
items.OrderBy(x => x.Id);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10181 次 |
| 最近记录: |