传送门
最大的收获就是这人将Distinct写了一个扩展方法出来,使用的贼方便。
第一种
- 首先,创建一个通用比较的类,实现IEqualityComparer接口:
public class CommonEqualityComparer<T, V> : IEqualityComparer<T>
{
private Func<T, V> keySelector;
public CommonEqualityComparer(Func<T, V> keySelector)
{
this.keySelector = keySelector;
}
public bool Equals(T x, T y)
{
return EqualityComparer<V>.Default.Equals(keySelector(x), keySelector(y));
}
public int GetHashCode(T obj)
{
return EqualityComparer<V>.Default.GetHashCode(keySelector(obj));
}
}
- 借助上面这个类,Distinct扩展方法就可以这样写:
public static class DistinctExtensions
{
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector)
{
return source.Distinct(new CommonEqualityComparer<T, V>(keySelector));
}
}
- 使用的时候就简单了
Product[] products =
{
new Product { Name = "Smallapple", Code = 9 },
new Product { Name = "orange", Code = 4 },
new Product { Name = "Bigapple", Code = 9 },
new Product { Name = "lemon", Code = 12 }
};
var p1 = products.Distinct(p => p.Code);
foreach (Product pro in p1)
Console.WriteLine(pro.Name + "," + pro.Code);
var p2 = products.Distinct(p => p.Name);
foreach (Product pro in p2)
Console.WriteLine(pro.Name + "," + pro.Code);
第二种
在实体类里直接这么写,都不在类开头实现IEqualityComparer<T>
接口,但是 IEqualityComparer<T>
接口中就是以下这些方法,直接下面这么写默认是实现了IEqualityComparer<T>
???,反正程序编译执行成功,结果也正确
public override bool Equals(object obj)
{
var another = (Item)obj;
return this.waybillcode == another.waybillcode;
}
public override int GetHashCode()
{
return this.waybillcode.GetHashCode();
}