¿Cuál es el más rápido (y menos intensivo en recursos) para comparar dos masivos (> 50,000 artículos) y como resultado tener dos listas como las siguientes:
- elementos que aparecen en la primera lista pero no en la segunda
- elementos que aparecen en la segunda lista pero no en la primera
Actualmente estoy trabajando con List o IReadOnlyCollection y resuelvo este problema en una consulta linq:
var list1 = list.Where(i => !list2.Contains(i)).ToList();
var list2 = list2.Where(i => !list.Contains(i)).ToList();
Pero esto no funciona tan bien como me gustaría. ¿Alguna idea de hacer esto más rápido y menos intensivo en recursos ya que necesito procesar muchas listas?
Equals(object)
y / o implementaIEquatable<T>
, debería estar bien.IEquatable<T>
implementación o elobject.Equals(object)
método. Parece que debería crear una nueva pregunta con un ejemplo reproducible mínimo : realmente no podemos diagnosticar cosas en los comentarios.Más eficiente sería usar
Enumerable.Except
:Este método se implementa mediante la ejecución diferida. Eso significa que podrías escribir, por ejemplo:
También es eficiente ya que internamente usa a
Set<T>
para comparar los objetos. Funciona al recopilar primero todos los valores distintos de la segunda secuencia y luego transmitir los resultados de la primera, verificando que no se hayan visto antes.fuente
Set<T>
se construye a partir de la segunda secuencia (es decir, está completamente iterado y almacenado), luego se obtienen los elementos que se pueden agregar desde la primera secuencia.Where
está parcialmente diferida porque enlist.Where(x => x.Id == 5)
el valor del número5
se almacena al inicio, en lugar de ejecutarse perezosamente.Esto funciona para todos los tipos de datos primitivos. Si necesita usarlo en objetos personalizados, debe implementar
IEqualityComparer
Define métodos para admitir la comparación de objetos para la igualdad.
fuente
SequenceEqual
es simplebool
. El OP quiere dos listas de resultados, y describe lo que quieren en términos de operaciones establecidas: "elementos que aparecen en la primera lista pero no en la segunda". No hay indicios de que el pedido sea relevante, mientras que SequenceEqual lo considera relevante. Esto parece estar respondiendo una pregunta completamente diferente.Si desea que los resultados no distingan entre mayúsculas y minúsculas , funcionará lo siguiente:
firstNotSecond
contendría b1.dllsecondNotFirst
contendría b2.dllfuente
¡No para este problema, pero aquí hay un código para comparar listas para igual y no! objetos idénticos:
fuente
Except
intenta de esta manera:
fuente
A veces solo necesitas saber si dos listas son diferentes, y no cuáles son esas diferencias. En ese caso, considere agregar este método de extensión a su proyecto. Tenga en cuenta que sus objetos listados deben implementar IEquatable!
Uso:
Cualquiera sea la
Component
clase, los métodos que se muestran aquí paraCar
deben implementarse casi de manera idéntica.Es muy importante tener en cuenta cómo hemos escrito GetHashCode. Para implementar correctamente
IEquatable
,Equals
yGetHashCode
debe operar en las propiedades de la instancia de una manera lógicamente compatible.Dos listas con el mismo contenido siguen siendo objetos diferentes y producirán diferentes códigos hash. Como queremos que estas dos listas sean tratadas como iguales, debemos dejar que
GetHashCode
produzca el mismo valor para cada una de ellas. Podemos lograr esto delegando el código hash a cada elemento de la lista y usando el XOR bit a bit estándar para combinarlos a todos. XOR es independiente del orden, por lo que no importa si las listas están ordenadas de manera diferente. Solo importa que no contengan nada más que miembros equivalentes.Nota: el nombre extraño implica el hecho de que el método no considera el orden de los elementos en la lista. Si te importa el orden de los elementos en la lista, ¡este método no es para ti!
fuente
He usado este código para comparar dos listas que tienen millones de registros.
Este método no tomará mucho tiempo.
fuente
Si solo se necesita un resultado combinado, esto también funcionará:
donde T es el tipo de elemento de listas.
fuente
Puede ser divertido, pero funciona para mí.
string.Join ("", List1)! = string.Join ("", List2)
fuente
Creo que esta es una manera simple y fácil de comparar dos listas elemento por elemento
fuente
Esta es la mejor solución que encontrarás
fuente
List<T>
para cada elemento enlist1
. También se llamalist3
al resultado cuando no es unList<T>
.