Как объединить два списка с помощью LINQ? - PullRequest
12 голосов
/ 02 февраля 2011

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

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

1 Ответ

19 голосов
/ 02 февраля 2011

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

Предпочтительно, избавьтесь от метода 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();

РЕДАКТИРОВАТЬ : Перечитав, только что понял, что требуется объединение, поскольку существует два списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...