我的计算机上存储的文件路径具有List。我的目的是首先过滤出具有相同名称的文件,然后过滤出具有相同大小的文件。
为此,我制作了两个实现IEqualityComparer<string>的类,并实现了EqualsGetHashCode方法。

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以处理比较的值。 IE。为您的尺寸比较器:

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?,首先评估哈希码。发生冲突时会调用Equals

显然,对FileInfo而不是字符串进行处理是明智的。

所以也许:
FileList.Select(x => new FileInfo(x))
        .Distinct(new CustomTextComparer())
        .Distinct(new CustomSizeComparer());

当然,那么您必须更改比较器以使用正确的类型。

关于c# - IEqualityComparer无法按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21402465/

10-09 19:39