让linq 的distinct更方便一点吧
linq 的 Distinct在集合操作中经常被用到。对于值类型的,很方便,直接Distinct()即可,但是对引用类型,需要实现一个 IEqualityComparer<in T> 的接口。
对每种引用类型,分别实现接口实在是太麻烦了。
一般来说,做这种distinct的时候,都是根据object的一个属性来判断是否是一个值。
比如:
public class User { public int ID { get; set; } public string Name { get; set; } }
一般来说,都是通过id这个属性来判断的,id一样既认为是同一个。
当然可以通过override User的equals和gethashcode来实现,但是不灵活。
如果我这次通过id来distinct下次通过name来distinct怎么办呢?
我希望有这样一种写法
var list = new List<User>();
list.Distinct(x => x.ID)
只要指定通过那个属性来判断,即可做出distinct
自己来写个扩展方法吧
1: public static IEnumerable<TSource> Distinct<TSource, TCompareElement>(this IEnumerable<TSource> source, Func<TSource, TCompareElement> CompareSelector)
2: {
3: return source.Distinct(new SinglePropertyEqualityComparer<TSource, TCompareElement>(CompareSelector));
4: }
5:
6: public class SinglePropertyEqualityComparer<T, Telement> : IEqualityComparer<T>
7: {
8: private readonly Func<T, Telement> CompareSelector;
9:
10: public SinglePropertyEqualityComparer(Func<T, Telement> compareSelector)
11: {
12: CompareSelector = compareSelector;
13: }
14:
15: public bool Equals(T x, T y)
16: {
17: return CompareSelector(x).Equals(CompareSelector(y));
18: }
19:
20: public int GetHashCode(T obj)
21: {
22: return CompareSelector(obj).GetHashCode();
23: }
24: }
只是linq 2 object哦。