Kann diese Implementierung eines IEqualityComparer verbessert werden? [geschlossen]

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

  •  21-09-2019
  •  | 
  •  

Frage

Ich sehe keine Probleme mit diesem Code, aber es fühlt sich an wie ich etwas fehle. Vielleicht ist es möglich, die Anzahl der Zeilen zu reduzieren. Oder gibt es noch einen Fehler zu beheben? Ich bin offen für alle Vorschläge.

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 ();
    }
}
War es hilfreich?

Lösung

Sie sollten zunächst true zurück, wenn die Gleichheit Betreiber Fileinfo true zurück. Auch die Art der gesuchten String-Vergleich Sie tun möchten. Vermutlich würden Sie Fall ignorieren, da diese Dateinamen sind.

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

Andere Tipps

Beim Vergleich nur die Name wird nur funktionieren, wenn Sie immer Dateien mit dem gleichen Verzeichnis zu vergleichen. Ich schlage vor, zu vergleichen, anstatt durch FullName.

Sie können ganz einfach den Umfang des Gleichheitsvergleiches auf Verzeichnisse erweitern, indem es für FileSystemInfo, die Basisklasse FileInfo und DirectoryInfo implementieren.

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();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top