2011-02-02 15 views
12

Jak scalić dwie listy przy użyciu LINQ jak poniżej:Jak scalić dwie listy za pomocą 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 }; 
    } 
} 

Mam dwie Lista osobę:

list1: 
1, A 
2, B 

list2: 
2, C 
3, D 

Chcę wynik podobny do poniższego

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

Każda pomoc !

Odpowiedz

19

Zdecydowanie polecam, aby nie używać łączenia ciągów do reprezentowania tych informacji; będziesz musiał wykonać niepotrzebne manipulacje ciągami, jeśli chcesz odzyskać oryginalne dane z późniejszej listy. Dodatkowo wersja scalona (w jej stanie) stanie się stratna, jeśli zdecydujesz się dodać dodatkowe właściwości do klasy.

Najlepiej pozbyć się metody Merge i użyć odpowiedniej struktury danych, takiej jak multimapa, która może mapować kolekcję kluczy na jedną lub więcej wartości. Klasa Lookup<TKey, TElement> może służyć temu celowi:

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

W każdym razie, aby odpowiedzieć na pytanie, jak poprosił, można złączyć dwie sekwencje, następnie grupa osób przez ich ID a następnie zsumować każdą grupę do pojedynczy osoba z dostarczonego Merge metody:

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

EDIT: po ponownym czytaniu, po prostu sobie sprawę, że Konkatenacja jest wymagana, ponieważ istnieją dwie listy.

+0

Dzięki za poradę, ale opublikowany kod to tylko próbka dla pomysłu, a nie mój prawdziwy kod. – Homam

Powiązane problemy