Подтвердить что ты не робот

Как объединить два списка с помощью LINQ?

Как объединить два списка, используя 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 };
    } 
}

У меня есть два списка:

list1:
1, A
2, B

list2: 
2, C
3, D

Я хочу получить результат следующим образом

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

Любая помощь!

4b9b3361

Ответ 1

Я бы настоятельно рекомендовал против использования конкатенации строк для представления этой информации; вам нужно будет выполнить ненужные манипуляции с строкой, если вы хотите получить исходные данные позже из объединенного списка. Кроме того, объединенная версия (как она есть) станет убыточной, если вы когда-нибудь решите добавить дополнительные свойства в класс.

Предпочтительно избавиться от метода Merge и использовать соответствующую структуру данных, такую ​​как мультимап, которая может отображать набор ключей для одного или нескольких значений. Для этой цели может служить Lookup<TKey, TElement>:

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

В любом случае, чтобы ответить на заданный вопрос, вы можете объединить две последовательности, затем группировать людей по их ID, а затем объединить каждую группу в один человек с предоставленным способом Merge:

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

EDIT: после повторного чтения просто понял, что требуется конкатенация, поскольку есть два списка.