pensé que la respuesta aceptada sería correcto en función de lo que Estaba leyendo en la ayuda inteligente para el método Excepto: "Produce la diferencia establecida de dos secuencias usando el comparador de igualdad predeterminado para comparar valores". Pero descubrí que no es una buena respuesta.
consideran este código:
Dictionary<string, List<string>> oldDict = new Dictionary<string, List<string>>()
{{"001A", new List<string> {"John", "Doe"}},
{"002B", new List<string> {"Frank", "Abignale"}},
{"003C", new List<string> {"Doe", "Jane"}}};
Dictionary<string, List<string>> newDict = new Dictionary<string, List<string>>()
{{"001A", new List<string> {"John", "Doe"}},
{"002B", new List<string> {"Frank", "Abignale"}},
{"003C", new List<string> {"Doe", "Jane"}}};
bool equal = oldDict.Count.Equals(newDict.Count) && !oldDict.Except(newDict).Any();
Console.WriteLine(string.Format("oldDict {0} newDict", equal?"equals":"does not equal"));
equal = oldDict.SequenceEqual(newDict);
Console.WriteLine(string.Format("oldDict {0} newDict", equal ? "equals" : "does not equal"));
Console.WriteLine(string.Format("[{0}]", string.Join(", ",
oldDict.Except(newDict).Select(k =>
string.Format("{0}=[{1}]", k.Key, string.Join(", ", k.Value))))));
Esto se traduce en lo siguiente:
oldDict does not equal newDict
oldDict does not equal newDict
[001A=[John, Doe], 002B=[Frank, Abignale], 003C=[Doe, Jane]]
Como se puede ver, tanto "oldDict" y "newDict" se configuran exactamente lo mismo. Y ni la solución sugerida ni una llamada a SequenceEqual funcionan correctamente. Me pregunto si es el resultado del Excepto el uso de la carga diferida o la forma en que el comparador está configurado para el Diccionario. (Aunque, mirando la estructura y las explicaciones de referencia sugieren que debería).
Aquí está la solución que se me ocurrió. Tenga en cuenta que la regla que utilicé es la siguiente: dos diccionarios son iguales si ambos contienen las mismas claves y los valores para cada coincidencia de clave. Tanto las claves como los valores deben estar en el mismo orden secuencial. Y mi solución puede no ser la más eficiente, ya que depende de iterar a través de todo el conjunto de claves.
private static bool DictionaryEqual(
Dictionary<string, List<string>> oldDict,
Dictionary<string, List<string>> newDict)
{
// Simple check, are the counts the same?
if (!oldDict.Count.Equals(newDict.Count)) return false;
// Verify the keys
if (!oldDict.Keys.SequenceEqual(newDict.Keys)) return false;
// Verify the values for each key
foreach (string key in oldDict.Keys)
if (!oldDict[key].SequenceEqual(newDict[key]))
return false;
return true;
}
también ver cómo cambian los resultados si: orden de la clave no es lo mismo. (Devuelve false)
newDict = new Dictionary<string, List<string>>()
{{"001A", new List<string> {"John", "Doe"}},
{"003C", new List<string> {"Doe", "Jane"}},
{"002B", new List<string> {"Frank", "Abignale"}}};
y partidos orden de la clave, pero el valor no coincide (devuelve false)
newDict = new Dictionary<string, List<string>>()
{{"001A", new List<string> {"John", "Doe"}},
{"002B", new List<string> {"Frank", "Abignale"}},
{"003C", new List<string> {"Jane", "Doe"}}};
Si el orden de secuencia no importa, la función se puede cambiar a la siguiente, pero es probable que haya un golpe de rendimiento.
private static bool DictionaryEqual_NoSort(
Dictionary<string, List<string>> oldDict,
Dictionary<string, List<string>> newDict)
{
// Simple check, are the counts the same?
if (!oldDict.Count.Equals(newDict.Count)) return false;
// iterate through all the keys in oldDict and
// verify whether the key exists in the newDict
foreach(string key in oldDict.Keys)
{
if (newDict.Keys.Contains(key))
{
// iterate through each value for the current key in oldDict and
// verify whether or not it exists for the current key in the newDict
foreach(string value in oldDict[key])
if (!newDict[key].Contains(value)) return false;
}
else { return false; }
}
return true;
}
Comprobar si el DictionaryEqual_NoSort utilizando la siguiente para newDict (DictionaryEquals_NoSort devuelve true):
newDict = new Dictionary<string, List<string>>()
{{"001A", new List<string> {"John", "Doe"}},
{"003C", new List<string> {"Jane", "Doe"}},
{"002B", new List<string> {"Frank", "Abignale"}}};
Esto no me parece correcto. –
Lo sentimos, ahora hemos agregado la falta para no corregirla. Los diccionarios son equivalentes si son del mismo tamaño y no hay elementos que estén en el primero y no en el segundo. –
Eso parece mejor;) –