2010-09-14 11 views
11

Tengo dos listas (L1, L2) de un objeto A, L1 se usa para almacenar la lista de objetos (de muchas a muchas relaciones) antes de que están cambiados. L2 es la relación después de haber sido cambiada. Necesito mantener los elementos comunes pero agregar los nuevos y eliminar los que no están en L2. Me preguntaba si había un trazador de líneas que podría utilizar con LINQ para lograr esto. Si necesita más información solo hágamelo saber.LINQ Comparando dos listas: agrega nuevas, elimina las antiguas, deja las que están en común

Gracias de antemano

+0

¿Hay algún motivo por el que no desee reemplazar toda la lista? Eso probablemente será más rápido. – recursive

+1

recursivo: cuando tuve que hacer esto, fue para actualizar 'ObservableCollection'; no desea volver a vincular cada celda en su DataGrid simplemente porque algunas filas han cambiado. – Gabe

+0

Quizás estoy malinterpretando, ¿pero no es lo que está pidiendo para el conjunto de objetos que están almacenados en L2? Para usar un ejemplo concreto, si tiene estas entradas: L1: \t {1, 2, 3, 4, 5} L2: \t {2, 3, 5, 7} No es el resultado deseado {2, 3, 5 , 7}? –

Respuesta

17

Si he entendido correctamente sus necesidades, esto debería funcionar:

L1.AddRange(L2.Except(L1)); 
L1.RemoveAll(item => !L2.Contains(item)); 
No

una sola línea, pero lo suficientemente cerca ...

1

intentar algo como esto

var a = from ele in list1 
     let alleles = list1.Union(list2) 
     let deleles = alleles.Except(list1) 
     let neweles = alleles.Except(list2) 
     select new { DeletedEles = deleles, NewEles = neweles }; 
1

Quizás los operadores booleanos de Linq como Intersect() podrían ser de ayuda para ti?

Cuestiones relacionadas