如何根据索引联接列表,如果索引已存在,则合并成员
本文关键字:索引 成员 存在 如果 合并 列表 何根 | 更新日期: 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
对象的列表,其中每个IGrouping
的Key
是您的 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