¿Hay un método LINQ para encontrar la diferencia entre dos diccionarios genéricos?
Igual que en this question, pero con diccionarios genéricos.encontrar la diferencia entre dos diccionarios
Respuesta
var diff = dicOne.Except(dicTwo).Concat(dicTwo.Except(dicOne));
¿este método compara solo las claves? –
@ bto.rdz No, tanto la clave como el valor. – Magnus
Excelente pero no te olvides de verificar 'null's –
algo como esto?
var dicOne = new Dictionary<string, string>(){ {"asdf", "asdf"}, {"few","faew"}};
var dicTwo = new Dictionary<string, string>(){ {"asdf", "asdf"}};
var unContained = dicOne.Where(x => !dicTwo.Contains(x));
No incluye esos elementos solo en' dictTwo' pero no en 'dictOne'. –
Si el rendimiento es importante, es posible que desee utilizar la búsqueda de hash de la clase Dictionary y obtener una mejora de la velocidad. Tomé un escenario de prueba de un diccionario con 1 millón de entradas, lo copié profundamente y realicé 10 ediciones (5 entradas eliminadas, 5 agregadas) a la copia. [Tenía una tarea que hacer implicaba buscar cambios en los datos, y luego presionar solo los cambios a otra función.]
Con LINQ (ver la respuesta de Magnus) el tiempo transcurrido según el cronómetro fue de 3600ms aprox. Con la comparación simple usando Dictionary.Contains(), el tiempo transcurrido fue 600ms aprox. El entorno era Visual Studio 2017 Community en el modo de depuración para un arnés de prueba ConsoleApp, en la misma máquina.
Su kilometraje puede variar, y es posible que tenga un número modesto de líneas, por lo que puede no importar, pero para los diccionarios más grandes vale la pena utilizar la funcionalidad de búsqueda de la clase de diccionario.
public static void DiffDictionaries<T, U>(
Dictionary<T, U> dicA,
Dictionary<T, U> dicB,
Dictionary<T, U> dicAdd,
Dictionary<T, U> dicDel)
{
// dicDel has entries that are in A, but not in B,
// ie they were deleted when moving from A to B
diffDicSub<T, U>(dicA, dicB, dicDel);
// dicAdd has entries that are in B, but not in A,
// ie they were added when moving from A to B
diffDicSub<T, U>(dicB, dicA, dicAdd);
}
private static void diffDicSub<T, U>(
Dictionary<T, U> dicA,
Dictionary<T, U> dicB,
Dictionary<T, U> dicAExceptB)
{
// Walk A, and if any of the entries are not
// in B, add them to the result dictionary.
foreach (KeyValuePair<T, U> kvp in dicA)
{
if (!dicB.Contains(kvp))
{
dicAExceptB[kvp.Key] = kvp.Value;
}
}
}
- 1. ¿Manera concisa de encontrar la diferencia "clave" entre 2 diccionarios?
- 2. ¿Cómo encontrar la diferencia entre dos cadenas?
- 3. Encontrar la posición de la diferencia entre dos cadenas
- 4. ¿Cómo puedo encontrar la diferencia entre dos fechas usando Javascript
- 5. Diferencia entre dos NSDates
- 6. diferencia entre dos matrices
- 7. Una mejor manera de encontrar una diferencia entre dos matrices
- 8. Diferencia entre dos mapas
- 9. 'Diferencia' entre dos cuaterniones
- 10. calcular la diferencia entre dos fechas
- 11. Una herramienta de diferencia de datos para encontrar la diferencia entre dos archivos MDB de acceso
- 12. Encontrar la distancia entre dos círculos
- 13. cómo encontrar la distancia entre dos geopoints?
- 14. Encontrar la intersección entre dos columnas
- 15. ¿Cuál es la diferencia entre esos dos?
- 16. ¿La diferencia más pequeña entre dos ángulos?
- 17. Obteniendo la diferencia entre dos repositorios
- 18. Encontrar diferencias entre dos repositorios git
- 19. diferencia entre dos SYSTEMTIME variable
- 20. Diferencia entre dos DateTimes C#?
- 21. C# - ¿Diferencia entre dos fechas?
- 22. Bash - Diferencia entre dos listas
- 23. ¿Ángulo entre dos vectores 2d, diferencia entre dos métodos?
- 24. La comparación de dos Diccionarios en C#
- 25. Combinar dos diccionarios con LINQ
- 26. Android diferencia entre dos fechas en segundos
- 27. encuentra la diferencia entre dos fechas en segundos
- 28. Diferencia entre dos instancias de la misma clase
- 29. Obteniendo la diferencia entre los recuentos de dos subconsultas
- 30. Encontrar la diferencia mínima entre elementos en una matriz
Usted puede usar 'AsEnumerable' "convertir" a su diccionario en un' IEnumerable ', y luego usar la solución sugerida en la cuestión vinculada. Como KeyValuePair es una estructura, debe comparar por valor. –
Heinzi
No necesita 'AsEnumerable', ya que no tiene absolutamente ninguna conversión. Solo es un método conveniente limitar los métodos intellisense a las extensiones 'IEnumerable' y permitir el uso de las extensiones 'IEnumerable ' en objetos que también implementan 'IQueryable ' sin necesidad de conversión. –
Nuffin
'dic1.Except (x => dic2.Contains (x)). Union (dic2.Except (x => dic1.Contais (X));', ¿quieres mejor método? –