Saltar al contenido

C# Compara dos diccionarios para la igualdad

No dejes de divulgar nuestros post y códigos con otro, danos de tu ayuda para hacer crecer nuestra comunidad.

Solución:

Así que primero necesitamos un comparador de igualdad para diccionarios. Necesita asegurarse de que tengan correspondencia keys y, si lo hacen, compare los valores de cada key:

public class DictionaryComparer :
    IEqualityComparer>

    private IEqualityComparer valueComparer;
    public DictionaryComparer(IEqualityComparer valueComparer = null)
    
        this.valueComparer = valueComparer ?? EqualityComparer.Default;
    
    public bool Equals(Dictionary x, Dictionary y)
    
        if (x.Count != y.Count)
            return false;
        if (x.Keys.Except(y.Keys).Any())
            return false;
        if (y.Keys.Except(x.Keys).Any())
            return false;
        foreach (var pair in x)
            if (!valueComparer.Equals(pair.Value, y[pair.Key]))
                return false;
        return true;
    

    public int GetHashCode(Dictionary obj)
    
        throw new NotImplementedException();
    

pero esto no es suficiente por sí solo. Necesitamos comparar los valores del diccionario usando otro comparador personalizado, no el comparador predeterminado, ya que el comparador de lista predeterminado no verá los valores de la lista:

public class ListComparer : IEqualityComparer>

    private IEqualityComparer valueComparer;
    public ListComparer(IEqualityComparer valueComparer = null)
    
        this.valueComparer = valueComparer ?? EqualityComparer.Default;
    

    public bool Equals(List x, List y)
    
        return x.SetEquals(y, valueComparer);
    

    public int GetHashCode(List obj)
    
        throw new NotImplementedException();
    

Que utiliza el siguiente método de extensión:

public static bool SetEquals(this IEnumerable first, IEnumerable second,
    IEqualityComparer comparer)

    return new HashSet(second, comparer ?? EqualityComparer.Default)
        .SetEquals(first);

Ahora podemos simplemente escribir:

new DictionaryComparer>(new ListComparer())
    .Equals(dict1, dict2);

Sé que esta pregunta ya tiene una respuesta aceptada, pero me gustaría ofrecer una alternativa aún más simple:

using System.Linq;
using System.Collections.Generic;

namespace Foo

    public static class DictionaryExtensionMethods
    
        public static bool ContentEquals(this Dictionary dictionary, Dictionary otherDictionary)
        
            return (otherDictionary ?? new Dictionary())
                .OrderBy(kvp => kvp.Key)
                .SequenceEqual((dictionary ?? new Dictionary())
                                   .OrderBy(kvp => kvp.Key));
        
    

Convierte el diccionario en un KeyValuePair enumere y luego compare como colecciones:

CollectionAssert.AreEqual(
   dict1.OrderBy(kv => kv.Key).ToList(),
   dict2.OrderBy(kv => kv.Key).ToList()
);

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *