c# – IEqualityComparer不按预期工作
发布时间:2020-12-15 03:52:37 所属栏目:百科 来源:网络整理
导读:我的计算机上存储的文件路径列表.我的目标是首先过滤出具有相同名称的文件,然后过滤出具有相同大小的文件. 为此,我已经实现了两个类实现IEqualityComparer string,并实现了Equals和GetHashCode方法. var query = FilesList.Distinct(new CustomTextComparer(
我的计算机上存储的文件路径列表.我的目标是首先过滤出具有相同名称的文件,然后过滤出具有相同大小的文件.
为此,我已经实现了两个类实现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()); 当然,您必须更改您的比较器以正确的类型工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |