我的计算机上存储的文件路径具有List
。我的目的是首先过滤出具有相同名称的文件,然后过滤出具有相同大小的文件。
为此,我制作了两个实现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
以处理比较的值。 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/