Kann diese Implementierung eines IEqualityComparer verbessert werden? [geschlossen]
-
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 ();
}
}
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();
}
}