Pregunta

Refiriéndose a la pregunta que previamente pregunté: Compare dos listas que contienen muchos objetos

Es impresionante ver qué tan rápido es la comparación de MAIDE al implementar la interfaz de iequelitycomparer: EJEMPLO AQUÍ

Como mencioné en mi otra pregunta, esta comparación me ayuda a hacer una copia de seguridad de una carpeta Sourse en una carpeta de destino. Sé que quiero sincronizar con las carpetas, por lo tanto, necesito comparar las fechas de los archivos. Cada vez que hago algo como:

public class MyFileComparer2 : IEqualityComparer<MyFile>
{

    public bool Equals(MyFile s, MyFile d)
    {
        return
            s.compareName.Equals(d.compareName) &&
            s.size == d.size &&
            s.deepness == d.deepness &&
            s.dateModified.Date <= d.dateModified.Date;  // This line does not work. 
            // I also tried comparing the strings by converting it to a string and it does
            // not work. It does not give me an error but it does not seem to include the files
            // where s.dateModified.Date < d.dateModified.Date

    }

    public int GetHashCode(MyFile a)
    {
        int rt = (a.compareName.GetHashCode() * 251 + a.size.GetHashCode() * 251 + a.deepness.GetHashCode() + a.dateModified.Date.GetHashCode());

        return rt;

    }
}

Será agradable si pudiera hacer algo similar usando más o igual que los signos. También intenté usar la propiedad de garrapatas y no funciona. Tal vez estoy haciendo algo mal. Creo que no es posible comparar las cosas con el signo inferior al igual que implementando esta interfaz. Además, no entiendo cómo funciona esta clase; Solo sé que es impresionante lo rápido que uerma a través de toda la lista.

¿Fue útil?

Solución

Dado que los objetos de DateTime son diferentes en el caso cuando un DateTime es menor que el otro, obtiene diferentes hashcodes para los objetos S y D y el método igual.no llamadoPara que su comparación de las fechas de las fechas funcione, debe eliminar la parte de la fecha del método GetHashCode:

public int GetHashCode(MyFile a)
{
    int rt = ((a.compareName.GetHashCode() * 251 + a.size.GetHashCode())
                          * 251 + a.deepness.GetHashCode()) *251;

    return rt;

}

Otros consejos

Todo su enfoque es defectuoso de manera financiera porque su método de generación de generación no es simétrico. Esto significa que IEqualityComparer.Equals no es igual a Equals(file1, file2) debido a la forma en que está utilizando menos que el operador.

La documentación:

  • ievalitycomparer.equals Method

    afirma claramente:

    Notas a los implementadores

    El método igual es reflexivo, simétrico y transitivo. Es decir, devuelve verdadero si se usa para comparar un objeto con sí mismo; cierto para dos objetos x e y si es cierto para y y x; y verdadero para dos objetos X y Z si es cierto para X e Y y también es cierto para y y z.

    Se requieren implementaciones para asegurarse de que si el método igual a que devuelve VERDADERO para dos objetos X e Y, entonces el valor devuelto por el método GetHashCode para X debe igual al valor devuelto para y.

    En su lugar, debe usar la interfaz de Equals(file2, file1) o IComparable en combinación con comparaciones de fecha. Si no lo hace, las cosas pueden parecer que funcionen por un tiempo, pero lo lamentará más tarde.

Su GetHashCode tiene un problema:

public int GetHashCode(MyFile a)
{
    int rt = (((a.compareName.GetHashCode() * 251) 
           + a.size.GetHashCode() * 251)
           + a.deepness.GetHashCode() *251) 
           + a.dateModified.Date.GetHashCode();

    return rt;

}

Cambié la parte de la fecha porque también necesitaba el tiempo, por lo tanto, uso la propiedad de garrapatas en su lugar.Me deshizo del código hashed de DataModified y funciona muy bien.Aquí es cómo modificé mi programa.Tenía problemas para comparar las fechas, por lo tanto, usé la propiedad Ticks.

public class MyFileComparer2 : IEqualityComparer<MyFile>
{

    public bool Equals(MyFile s, MyFile d)
    {
        return
            s.compareName.Equals(d.compareName) &&
            s.size == d.size &&
            s.deepness == d.deepness &&
            //s.dateModified.Date <= d.dateModified.Date &&
            s.dateModified.Ticks >= d.dateModified.Ticks
            ;  

    }

    public int GetHashCode(MyFile a)
    {
        int rt = (((a.compareName.GetHashCode() * 251)
                + a.size.GetHashCode() * 251)
                + a.deepness.GetHashCode() * 251)
                //+ a.dateModified.Ticks.GetHashCode();                       
                ;

        return rt;

    }
}

Todavía no sé cómo funciona esta función de código hash.Lo bueno es que funciona muy bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top