这种实现的的IEqualityComparer可以改善呢? [关闭]
-
21-09-2019 - |
题
我不明白这个代码的任何问题,但感觉就像我失去了一些东西。也许是可以减少的行数。还是说没有一个bug是固定的?我愿意接受任何建议。
public class NameComparer : IEqualityComparer<FileInfo>
{
public bool Equals (FileInfo x, FileInfo y)
{
if (x == null) {
return y == null;
}
if (y == null) {
return false;
}
return x.Name.Equals (y.Name);
}
public int GetHashCode (FileInfo obj)
{
return obj.Name.GetHashCode ();
}
}
解决方案
您应该首先如果FileInfo的平等运算符返回true返回true。此外,指定你想要做字符串比较的类型。想必你想要忽略的情况下,因为这些文件名。
public class NameComparer : IEqualityComparer<FileInfo>
{
public bool Equals(FileInfo x, FileInfo y)
{
if (x == y)
{
return true;
}
if (x == null || y == null)
{
return false;
}
return string.Equals(x.FullName, y.FullName, StringComparison.OrdinalIgnoreCase);
}
public int GetHashCode (FileInfo obj)
{
return StringComparer.OrdinalIgnoreCase.GetHashCode(obj.FullName);
}
}
其他提示
相比只是Name
如果你总是比较同一目录下的文件才会工作。我建议由FullName
比较来代替。
可以容易地将相等比较器的范围由实现它为FileSystemInfo
,基类FileInfo
和DirectoryInfo
的延伸到目录。
public sealed class FullNameComparer : IEqualityComparer<FileSystemInfo>
{
public bool Equals(FileSystemInfo x, FileSystemInfo y)
{
if (x == y)
{
return true;
}
if (x == null || y == null)
{
return false;
}
return String.Equals(x.FullName.TrimEnd('\\'), y.FullName.TrimEnd('\\'), StringComparison.OrdinalIgnoreCase);
}
public int GetHashCode(FileSystemInfo obj)
{
return obj.FullName.GetHashCode();
}
}
不隶属于 StackOverflow