Distinct方法的使用引申出来的扩展方法的编写

传送门
最大的收获就是这人将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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值