
为此,我已经实现了两个类实现IEqualityComparer< string>,并实现了Equals和GetHashCode方法.
var query = filesList.distinct(new CustomTextComparer()) .distinct(new CustomSizeComparer());
这两个类的代码如下:
public class CustomTextComparer : IEqualityComparer<string>{ public bool Equals(string x,string y) { if (Path.Getfilename(x) == Path.Getfilename(y)) { return true; } return false; } public int GetHashCode(string obj) { return obj.GetHashCode(); }}public class CustomSizeComparer : IEqualityComparer<string>{ public bool Equals(string x,string y) { if (new fileInfo(x).Length == new fileInfo(y).Length) { return true; } else { return false; } } public int GetHashCode(string obj) { return obj.GetHashCode(); }} 但代码不起作用.
它不会抛出任何异常,也没有任何编译器错误,但问题是代码不起作用(不排除重复的文件).
那么我该如何解决这个问题呢?有什么可以做的,使代码正常工作.
解决方法 更改您的GetHashCode来处理比较的值.即为您的尺寸比较:public int GetHashCode(string obj){ return fileInfo(x).Length.GetHashCode();} 另一方面:
public int GetHashCode(string obj){ return Path.Getfilename(obj).GetHashCode();} 根据这个答案 – What’s the role of GetHashCode in the IEqualityComparer<T> in .NET?,首先评估哈希码.在碰撞的情况下调用等于.
显然,在fileInfos上工作,而不是字符串是合理的.
所以也许
fileList.Select(x => new fileInfo(x)) .distinct(new CustomTextComparer()) .distinct(new CustomSizeComparer());
当然,您必须更改您的比较器以正确的类型工作.
总结以上是内存溢出为你收集整理的c# – IEqualityComparer不按预期工作全部内容,希望文章能够帮你解决c# – IEqualityComparer不按预期工作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)