这个 IEqualityComparer 的实现能否改进?

3

我觉得这段代码没有问题,但感觉好像缺少什么。也许可以减少代码行数。或者说有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 ();
    }
}

2
你可以检查 x 和 y 是否引用同一个对象。 - Zenon
1
您可能需要考虑是否需要进行不区分大小写的比较。 - Joe
1
代码审查问题应该提交到http://codereview.stackexchange.com。 - beatgammit
2个回答

9
如果FileInfo的等于运算符返回true,您应该首先返回true。此外,指定您想要执行的字符串比较类型。由于这些是文件名,您可能希望忽略大小写。请注意保留HTML标记。
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);
   }
}

2
仅比较Name仅对于始终比较相同目录下的文件有效。我建议改为通过FullName进行比较。
您可以通过为FileSystemInfo实现相等比较器,将其范围轻松扩展到目录,FileInfoDirectoryInfo的基类。
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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接