[英]Compare two lists that contain a lot of objects (3th part) “those objects have different type”
[英]Compare two lists that contain a lot of objects (2th part)
提到我之前提出的问题: 比较两个包含很多对象的列表
令人印象深刻的是,通过实现IEqualityComparer接口,可以快速地进行比较: 此处的示例
正如我在其他问题中提到的那样,此比较有助于我将源文件夹备份到目标文件夹中。 知道我想同步到文件夹,因此我需要比较文件的日期。 每当我做类似的事情:
public class MyFileComparer2 : IEqualityComparer<MyFile>
{
public bool Equals(MyFile s, MyFile d)
{
return
s.compareName.Equals(d.compareName) &&
s.size == d.size &&
s.deepness == d.deepness &&
s.dateModified.Date <= d.dateModified.Date; // This line does not work.
// I also tried comparing the strings by converting it to a string and it does
// not work. It does not give me an error but it does not seem to include the files
// where s.dateModified.Date < d.dateModified.Date
}
public int GetHashCode(MyFile a)
{
int rt = (a.compareName.GetHashCode() * 251 + a.size.GetHashCode() * 251 + a.deepness.GetHashCode() + a.dateModified.Date.GetHashCode());
return rt;
}
}
如果我可以使用大于或等于符号的方式做类似的事情,那就太好了。 我也尝试使用tick属性,但它不起作用。 也许我做错了什么。 我相信无法将实现此接口的小于等号的事物进行比较。 而且,我不了解该课程的工作方式; 我只知道在整个列表中进行迭代的速度如此之快令人印象深刻。
您的整个方法从根本上来说都是有缺陷的,因为您的IEqualityComparer.Equals
方法不是对称的。 这意味着由于您使用小于运算符的方式Equals(file1, file2)
不等于Equals(file2, file1)
。
文件:
明确指出:
实施者须知
等于方法是自反,对称和可传递的。 也就是说,如果用于将对象与其自身进行比较,则返回true;否则,返回true。 如果两个对象x和y为y,则为true;否则为true。 如果两个对象x和z分别为true和y和z,则为true。
需要实现以确保如果Equals方法为两个对象x和y返回true,则GetHashCode方法为x返回的值必须等于为y返回的值。
相反,您需要结合使用IComparable
接口或IEqualityComparer
与日期比较。 如果您不这样做,那么事情似乎会持续一段时间,但您稍后会后悔。
由于当一个DateTime小于另一个DateTime时,DateTime对象是不同的,因此对于对象s和d ,您将获得不同的哈希码,并且不会调用Equals方法。 为了比较工作日期,应从GetHashCode方法中删除日期部分:
public int GetHashCode(MyFile a)
{
int rt = ((a.compareName.GetHashCode() * 251 + a.size.GetHashCode())
* 251 + a.deepness.GetHashCode()) *251;
return rt;
}
您的GetHashCode有问题:
public int GetHashCode(MyFile a)
{
int rt = (((a.compareName.GetHashCode() * 251)
+ a.size.GetHashCode() * 251)
+ a.deepness.GetHashCode() *251)
+ a.dateModified.Date.GetHashCode();
return rt;
}
我更改了日期部分,因为我还需要时间,因此我改用了ticks属性。 我摆脱了dateModified哈希码,效果很好。 这是我修改程序的方式。 我在比较日期时遇到了麻烦,因此我使用了Ticks属性。
public class MyFileComparer2 : IEqualityComparer<MyFile>
{
public bool Equals(MyFile s, MyFile d)
{
return
s.compareName.Equals(d.compareName) &&
s.size == d.size &&
s.deepness == d.deepness &&
//s.dateModified.Date <= d.dateModified.Date &&
s.dateModified.Ticks >= d.dateModified.Ticks
;
}
public int GetHashCode(MyFile a)
{
int rt = (((a.compareName.GetHashCode() * 251)
+ a.size.GetHashCode() * 251)
+ a.deepness.GetHashCode() * 251)
//+ a.dateModified.Ticks.GetHashCode();
;
return rt;
}
}
我仍然不知道此哈希码功能如何工作。 令人高兴的是,它运作良好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.