Pregunta

No veo ningún problema con este código, pero se siente como que me falta algo. Tal vez es posible reducir el número de líneas. O hay incluso un insecto que se fija? Estoy abierto a cualquier sugerencia.

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 ();
    }
}
¿Fue útil?

Solución

En primer lugar, debe devolver true si el operador de igualdad de la FileInfo devuelve verdadero. Además, especifique el tipo de comparación de cadenas que quiere hacer. Es de suponer que querría hacer caso omiso caso, ya que estos son los nombres de archivo.

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

Otros consejos

Al comparar sólo el Name sólo funcionará si siempre está comparando archivos del mismo directorio. Sugiero la comparación por FullName lugar.

Se puede ampliar fácilmente el alcance del comparador de igualdad a los directorios mediante la implementación para FileSystemInfo, la clase base de FileInfo y 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();
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top