gpt4 book ai didi

c# - IEqualityComparer 未按预期工作

转载 作者:可可西里 更新时间:2023-11-01 08:53:44 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com