されたIEqualityComparerのこの実装を向上させることができますか? [閉まっている]
-
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
のためにそれを実装することによって、ディレクトリへのFileInfo
と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();
}
}
所属していません StackOverflow