Pregunta

Tengo un Diccionario en el que estoy comparando a otro Diccionario (variables de tipo IDictionary).Haciendo d1.Es igual a(d2) devuelve false.Escribiendo mi propio código por debajo de los rendimientos de la verdad.Ambos son System.Collections.Generic.Dictionary.Me estoy perdiendo algo o no Dictionary no tienen un Equals la aplicación que compara claves/valores?

private static bool DictEquals<K, V>(IDictionary<K, V> d1, IDictionary<K, V> d2)
{
    if (d1.Count != d2.Count)
        return false;

    foreach (KeyValuePair<K, V> pair in d1)
    {
        if (!d2.ContainsKey(pair.Key))
            return false;

        if (!Equals(d2[pair.Key], pair.Value))
            return false;
    }

    return true;
}
¿Fue útil?

Solución

Dictionary.Equals () usa el valor predeterminado Equals from Object, verificando si los dos objetos son la misma referencia, al igual que todas las otras colecciones predeterminadas. Eres libre de crear tu propia subclase con semántica de valor, aunque eso generalmente incluye que las cosas también sean inmutables.

Otros consejos

Probablemente el método Equals de la clase Dictionary simplemente recurra a la implementación predeterminada heredada de Object, es decir, simplemente compara la referencia de objeto <=> pasada con su propia referencia. Consulte aquí: Referencia de Object.Equals

Suponiendo que los dos diccionarios, uno de ellos un SortedList<TKey, TValue> y uno de Dictionary<TKey, TValue>, se comparan para la igualdad, si es que realmente devuelve true si los elementos son los mismos?Que sería bastante malo, ya que tienen distintas características y funciones (la SortedList<,> por ejemplo, permite la recuperación a través de un índice).

También, la igualdad y el código hash son, lógicamente, atados juntos.El código hash debe ser inmutable, de lo contrario todos los hash a partir de los algoritmos no funcionará.Usted no puede garantizar esto cuando usted está utilizando el contenido para comprobar la igualdad.Por lo tanto, la implementación predeterminada (la comprobación de si son la misma instancia) es bastante cuerdo.Eres libre de crear su propio contenido de la comparación de igualdad, aunque.

Otros han mencionado que está usando la implementación Object.Equals, puede usar lo siguiente para anularla:

public class EqualsDictionary<T, T> : Dictionary<T, T>
{
    public override bool Equals(object obj)
    {
        //Place your comparison implementation here
    }
}

Las referencias en .NET pueden usarse para encapsular la identidad de un objeto, aspectos mutables de su estado, ambos o ninguno, además de encapsular aspectos inmutables del estado de un objeto. En general, en ausencia de una razón particular para suponer lo contrario, .NET asume que las referencias a objetos mutables se usan con el fin de encapsular la identidad. Además, supone que en los casos en que el código compara referencias sin saber lo que representan, es mejor equivocarse al informar que las cosas son desiguales. Como tal, dos referencias a objetos mutables generalmente se consideran equivalentes si y solo si identifican el mismo objeto, y se desaconseja que los tipos mutables anulen Equals para indicar cualquier otra cosa. En cambio, el código que usa referencias para encapsular el estado mutable debería usar otros medios además de Object.Equals() para compararlos.

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