我有一个LINQ Distinct()语句,它使用我自己的自定义比较器,如下所示:
class MyComparer<T> : IEqualityComparer<T> where T : MyType
{
public bool Equals(T x, T y)
{
return x.Id.Equals(y.Id);
}
public int GetHashCode(T obj)
{
return obj.Id.GetHashCode();
}
}
...
var distincts = bundle.GetAllThings.Distinct(new MyComparer<MySubType>());
这一切都很好,正如我所希望的那样工作。出于好奇,我是否需要定义自己的比较器,或者可以用一个委托来替换它?我想我应该能够做如下的事情:
var distincts = bundle.GetAllThings.Distinct((a,b) => a.Id == b.Id);
但这并不能编译。有什么好办法吗?
5条答案
按热度按时间h7wcgrx31#
Distinct接受一个IEqualityComparer作为第二个参数,所以你需要一个IEqualityComparer。不过,创建一个接受委托的泛型并不太难。当然,这可能已经在某些地方实现了,比如MoreLINQ在其他答案中建议的。
您可以像这样实现它:
其语法如下:
或者,如果你觉得这样更清楚:
f1tvaqid2#
不幸的是,
Distinct
没有提供这样的重载,所以您所拥有的是一个很好的选择。对于MoreLinq,可以使用
DistinctBy
运算符。您可能还想考虑编写一个泛型
ProjectionEqualityComparer
,它可以将适当的委托转换为IEqualityComparer<T>
实现,如here所列的实现。niknxzdl3#
下面是我的C#小把戏:
iqxoj9l94#
这个link展示了如何创建扩展方法,以便能够以您给出的方式使用Distinct。您需要编写两个
Distinct
扩展方法,以及一个IEqualityComparer
。下面是来自该网站的代码:
rlcwz9us5#
从NET6开始,
DistinctBy
扩展方法被添加到System.Linq的库中。例如: