今天遇到一个数组再分组的情况,思路是先找到分组的原则,之后再遍历一次得到分组的数据。
就是把所有重复的数据去掉,(分组依据)
重写了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群里一个网友 拣尽寒枝。