2011-02-02 18 views
12

cómo combinar dos listas usando LINQ como la siguiente:¿Cómo combinar dos listas usando LINQ?

class Person 
{ 
    public int ID { get; set;} 
    public string Name { get; set;} 
    public Person Merge(Person p) 
    { 
     return new Person { ID = this.ID, Name = this.Name + " " + p.Name }; 
    } 
} 

tengo dos Lista de la persona:

list1: 
1, A 
2, B 

list2: 
2, C 
3, D 

Quiero el resultado como el siguiente

result: 
1, A 
2, B C 
3, D 

Cualquier ayuda !

Respuesta

19

Recomiendo encarecidamente que no se use la concatenación de cadenas para representar esta información; tendrá que realizar una manipulación de cadena innecesaria si desea recuperar los datos originales más tarde de la lista fusionada. Además, la versión combinada (tal como está) se volverá con pérdidas si alguna vez decide agregar propiedades adicionales a la clase.

Preferiblemente, deshágase del método Merge y utilice una estructura de datos adecuada, como un multimapa, que pueda asignar una colección de claves a uno o más valores. La clase Lookup<TKey, TElement> puede servir a este propósito:

var personsById = list1.Concat(list2) 
         .ToLookup(person => person.ID); 

todos modos, para responder a la pregunta pedido, puede concatenar las dos secuencias, entonces grupo personas por su ID y luego se agregan cada grupo en una sola persona con el método proporcionado Merge:

var mergedList = list1.Concat(list2) 
         .GroupBy(person => person.ID) 
         .Select(group => group.Aggregate(
             (merged, next) => merged.Merge(next))) 
         .ToList(); 

EDITAR: Tras la relectura, simplemente se dio cuenta de que una se requiere concatenación ya que hay dos listas.

+0

Gracias por el consejo, pero el código publicado es solo una muestra de la idea, no es mi código real. – Homam

Cuestiones relacionadas