如何使用LINQ合并两个列表?

13

如何使用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

我强烈建议不要使用字符串拼接来表示这些信息;如果您稍后想从合并的列表中获取原始数据,则需要进行不必要的字符串操作。此外,如果您决定向类中添加其他属性,则合并版本(目前)将变得具有丢失性。

最好摆脱Merge方法,并使用适当的数据结构,例如multimap,可以将一组键映射到一个或多个值。 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();

编辑:重新阅读后才意识到需要连接两个列表,因此需要进行拼接。


谢谢您的建议,但是发布的代码只是为了表达想法而提供的样例,并不是我的真实代码。 - Homam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接