IEqualityComparer 的实现可以改进吗?

发布于 2024-08-12 06:14:26 字数 1459 浏览 7 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

第几種人 2024-08-19 06:14:26

如果 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);
   }
}

You should first return true if the FileInfo's equality operator returns true. Also, specify the type of string comparison you want to do. Presumably you'd want to ignore case, since these are filenames.

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);
   }
}
初相遇 2024-08-19 06:14:26

仅当您始终比较同一目录的文件时,仅比较名称才有效。我建议改为通过 FullName 进行比较。

通过为 FileSystemInfoFileInfoDirectoryInfo 的基类)实现它,您可以轻松地将相等比较器的范围扩展到目录。

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();
    }
}

Comparing just the Name will only work if you're always comparing files of the same directory. I suggest comparing by FullName instead.

You can easily extend the scope of the equality comparer to directories by implementing it for FileSystemInfo, the base class of FileInfo and 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();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文