如果您不想仅仅为了获得DistinctBy
功能而将MoreLinq库添加到您的项目中,那么可以使用Linq Distinct
方法的重载(接受IEqualityComparer
参数)来获得相同的最终结果。
首先创建一个通用的自定义相等比较器类,该类使用lambda语法对一个通用类的两个实例执行自定义比较:
public class CustomEqualityComparer<T> : IEqualityComparer<T>
{
Func<T, T, bool> _comparison;
Func<T, int> _hashCodeFactory;
public CustomEqualityComparer(Func<T, T, bool> comparison, Func<T, int> hashCodeFactory)
{
_comparison = comparison;
_hashCodeFactory = hashCodeFactory;
}
public bool Equals(T x, T y)
{
return _comparison(x, y);
}
public int GetHashCode(T obj)
{
return _hashCodeFactory(obj);
}
}
然后在您的主代码中按如下方式使用它:
Func<Person, Person, bool> areEqual = (p1, p2) => int.Equals(p1.Id, p2.Id);
Func<Person, int> getHashCode = (p) => p.Id.GetHashCode();
var query = people.Distinct(new CustomEqualityComparer<Person>(areEqual, getHashCode));
瞧!:)
以上假定以下条件:
- 属性
Person.Id
类型int
- 该
people
集合不包含任何null元素
如果集合可以包含null,则只需重写lambda以检查是否为null,例如:
Func<Person, Person, bool> areEqual = (p1, p2) =>
{
return (p1 != null && p2 != null) ? int.Equals(p1.Id, p2.Id) : false;
};
编辑
这种方法类似于弗拉基米尔·内斯特罗夫斯基的答案,但更简单。
它也类似于Joel的回答,但是允许涉及多个属性的复杂比较逻辑。
但是,如果你的对象永远只能相差Id
那么其他用户给出了正确的答案,所有你需要做的是重写的默认实现GetHashCode()
,并Equals()
在你的Person
类,然后只用出的现成的Distinct()
LINQ的方法进行筛选删除所有重复项。