2011-02-02 5 views
12

Comment fusionner deux listes en utilisant LINQ comme ce qui suit:Comment fusionner deux listes en utilisant 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 }; 
    } 
} 

J'ai deux Liste des personnes:

list1: 
1, A 
2, B 

list2: 
2, C 
3, D 

Je veux que le résultat comme le

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

Toute aide !

Répondre

19

Je vous déconseille fortement d'utiliser la concaténation de chaînes pour représenter cette information; vous devrez effectuer une manipulation de chaîne inutile si vous souhaitez récupérer les données d'origine ultérieurement dans la liste fusionnée. De plus, la version fusionnée (telle quelle) deviendra perdante si vous décidez d'ajouter des propriétés supplémentaires à la classe.

De préférence, supprimez la méthode Merge et utilisez une structure de données appropriée telle qu'un multimap qui peut mapper une collection de clés à une ou plusieurs valeurs. La classe Lookup<TKey, TElement> peut servir à cette fin:

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

Quoi qu'il en soit, pour répondre à la question posée, vous pouvez concaténer les deux séquences, puis les personnes du groupe par leur ID puis agrègent chaque groupe dans un unique personne avec la méthode fournie Merge:

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

EDIT: Lors de la relecture, vient de réaliser qu'un la concaténation est requise car il existe deux listes.

+0

Merci pour le conseil, mais le code posté est juste un échantillon pour l'idée, pas mon vrai code. – Homam

Questions connexes