如何根据索引联接列表,如果索引已存在,则合并成员

本文关键字:索引 成员 存在 如果 合并 列表 何根 | 更新日期: 2023-09-27 18:34:02

我有 3 个包含对象的不同列表。每个对象都有几个成员/变量,其中一个用作特殊标识符(索引)。我想加入这 3 个列表,如果有具有相同标识符的对象,那么这两个列表元素应该合并为一个列表元素

List1
id= 1, name= x, value= 10
id= 2, name= tz, value= 10
List2
id= 2, name= y, value= 11
List3
id= 3, name=z, value= 12
id= 4, name hh, value= 16
final List
id= 1, name= x, value= 10
id= 2, name= tz, value= 10, name= y, value= 11
id= 3, name=z, value= 12
id= 4, name hh, value= 16

我对lambda表达式和LINQ有一些经验,但我无法解决问题。

如何根据索引联接列表,如果索引已存在,则合并成员

您可以连接列表并按 id 分组,假设列表包含相同类型的项目。

var newList = list1.Concat(list2).Concat(list3).GroupBy(x => x.id).ToList();

这将为您提供一个IGrouping对象的列表,其中每个IGroupingKey是您的 id,IGrouping对象是原始列表中类型的IEnumerable

foreach(var group in newList)
{
    var id = group.Key;
    Console.Write("id=" + id)
    foreach(var item in group)
    {
        Console.Write(", name=" + item.name + ", value=" + item.value);
    }
    Console.WriteLine();
}

我会首先按 ID 对项目进行分组(与 @juharr 的答案相同),我建议将结果进一步投影到 IEnumerable ( groupedById ),其中每个项目都有一个id属性和一个名为 itemsWithId 的属性,而属性又是一个IEnumerable<YourOriginalItemType>

List<item> l1 = new List<item>() { new item { id = 1, name = "John", value = "Smith" }, new item { id = 2, name = "James", value = "Jackson" } };
List<item> l2 = new List<item>() { new item { id = 2, name = "Jean", value = "Smith" }, new item { id = 3, name = "Bob", value = "Roberts" } };
var groupedById = l1.Concat(l2).GroupBy(i => i.id).Select(grp => new { id = grp.Key, itemsWithId = grp });
//usage:
foreach (var group in groupedById)
{
    Console.WriteLine("ItemId: " + group.id);
    foreach (var item in group.itemsWithId)
    {
        Console.WriteLine("'tName: " + item.name + ", Value: " + item.value);                    
    }
}

输出:

ItemId: 1
        Name: John, Value: Smith
ItemId: 2
        Name: James, Value: Jackson
        Name: Jean, Value: Smith
ItemId: 3
        Name: Bob, Value: Roberts