Distinct自定义去重

今天遇到一个数组再分组的情况,思路是先找到分组的原则,之后再遍历一次得到分组的数据。
就是把所有重复的数据去掉,(分组依据)
重写了IEqualityComparer<>接口,并实现了它,但是有一点当明没有搞明白。就是第二个gethashcode的作用,后来发现
这是msdn上的原话:
https://msdn.microsoft.com/zh-cn/library/ms132151.aspx
使用此接口,可以实现集合的自定义相等比较。也就是说,对于类型 T,您可以创建自己的相等定义,并指定该定义可与接受 IEqualityComparer 泛型接口的集合类型一起使用。在 .NET Framework 中,Dictionary

  class DataCompare : IEqualityComparer<DateTime>
    {

        public bool Equals(DateTime x, DateTime y)
        {
            return x.Hour == y.Hour;
        }

        public int GetHashCode(DateTime obj)
        {
            return (obj.Year + obj.Month + obj.Day + obj.Hour).ToString().GetHashCode();

        }
    }

调用代码如下:

 InitializeComponent();

            Random rand = new Random();
            List<DateTime> list = new List<DateTime>();
            for (int i = 0; i < 100; i++)
            {
                list.Add(new DateTime(2016, rand.Next(1, 12), rand.Next(1, 31), rand.Next(1, 12),rand.Next(1,59),rand.Next(1,59)));
            }
            if (null != list)
            {
                List<DateTime> list3 = list.Distinct(new DataCompare()).ToList();

                if (null != list3)
                {
                    List<List<DateTime>> collcetion = new List<List<DateTime>>();
                    foreach (DateTime time in list3)
                    {
                        collcetion.Add(list.Where(i => i.Month==time.Month&& i.Day == time.Day&&i.Hour==time.Hour).ToList());
                    }
                }

            }

这下面的是说gethashcode的作用
来自网络:
整体来说,比较好理解
Equals方法:自反的、对称的和可传递的。也就是说,如果此方法用于将某个对象与其自身比较,则它将返回true;如果对 y 和 x 执行此方法返回 true,则对 x 和 y 这两个对象也返回 true;如果对x 和 y 执行此方法返回 true,并且对y 和 z 执行此方法也返回 true,则对x 和 z 这两个对象也返回 true。
实现需要确保如果对两个对象 x 和 y 执行 Equals 方法返回 true,则对x 和 y 分别执行 GetHashCode 方法所返回的值必须相等。
GetHashCode方法:实现需要确保如果对两个对象x 和 y 执行 Equals 方法返回true,则对 x 和 y 分别执行 GetHashCode 方法所返回的值必须相等。
当我们用Linq操作我们自定义的对象时,我们会发现有些方法直接使用的话根本不起作用,比如:Distinct、Except、Intersect等扩展方法。这是就需要定义IEqualityComparer接口来判断两个对象的相等性。

http://blog.csdn.net/chinajiyong/article/details/8161944

再次谢谢wpf群里一个网友 拣尽寒枝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值