c# – IEqualityComparer不按预期工作

我的计算机上存储的文件路径列表.我的目标是首先过滤出具有相同名称文件,然后过滤出具有相同大小的文件.
为此,我已经实现了两个类实现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());

当然,您必须更改您的比较器以正确的类型工作.

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么