されたIEqualityComparerのこの実装を向上させることができますか? [閉まっている]

StackOverflow https://stackoverflow.com/questions/1779175

  •  21-09-2019
  •  | 
  •  

質問

私はこのコードで何か問題が表示されていないが、私は何かが欠けてるようには感じています。多分ラインの数を削減することが可能です。または固定することも、バグがありますか?私は、任意の提案に開いている。

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のためにそれを実装することによって、ディレクトリへの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();
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top