我读了一本关于Linq的书,发现Distinct方法有一个需要比较器的重载。对于我想要从集合中获取不同的实体,但希望比较实体ID的问题,这将是一个很好的解决方案,即使其他属性不同。
根据这本书,如果我有一个Gribulator实体,我应该能够创建一个这样的比较器...
private class GribulatorComparer : IComparer<Gribulator> {
public int Compare(Gribulator g1, Gribulator g2) {
return g1.ID.CompareTo(g2.ID);
}
}
...and然后像这样使用它...
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进行比较。
谢谢你的帮助。
发布于 2012-11-11 14:31:28
您正在将比较器实现为IComparer<T>
,LINQ方法重载需要IEqualityComparer
的实现
private class GribulatorComparer : IEqualityComparer<Gribulator> {
public bool Equals(Gribulator g1, Gribulator g2) {
return g1.ID == g2.ID;
}
}
编辑:
需要说明的是,由于Compare()
方法基本上就是这样做的,所以可以使用IComparer
接口进行排序。
如下所示:
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);
https://stackoverflow.com/questions/13331985
复制相似问题