如何合并泛型列表及其属性
本文关键字:列表 属性 泛型 何合并 合并 | 更新日期: 2023-09-27 18:34:04
我有 2 个相同类型的通用列表 "Person"每个列表都有"订单"属性列表。
人员ID(标识符)可以在展位列表中重复。但订单不能。
我想要的输出应该是 1 个列表,当每个人都有一个实例
时并且所有订单都已合并。
我的问题是,最好的方法(性能)是什么?
如下一段代码所述:
class Program
{
public class Order
{
public string OrderId { get; set; }
}
public class Person
{
public string Id { get; set; }
public List<Order> orders { get; set; }
}
static void Main(string[] args)
{
// build list 1
Person p1 = new Person() { Id = "John", orders = new List<Order>() };
p1.orders.Add(new Order() { OrderId = "John order 1" });
Person p2 = new Person() { Id = "Paul", orders = new List<Order>() };
p2.orders.Add(new Order() { OrderId = "Paul order 1" });
List<Person> L1 = new List<Person>();
L1.Add(p1);
L1.Add(p2);
// build list 2
Person p3 = new Person() { Id = "John", orders = new List<Order>() };
p3.orders.Add(new Order() { OrderId = "John order 2" });
List<Person> L2 = new List<Person>();
L2.Add(p3);
//output
List<Person> merged = new List<Person>();
merged = L1.Union(L2, new PersonComparer()).ToList();
foreach (var item in merged)
{
Console.WriteLine("Person ID: {0}", item.Id);
foreach (var order in item.orders)
{
Console.WriteLine(" -- {0}", order.OrderId);
}
Console.WriteLine("-----------------");
}
Console.ReadKey();
}
}
输出:
/************************************************************
* current output:
*
* Presone ID: John
* --- John order 1
* -------------------------
* Presone ID: Paul
* --- Paul order 1
* ------------------------
* Presone ID: John
* --- John order 2
*
*
* desired output:
*
* Presone ID: John
* --- John order 1
* --- John order 2
* -------------------------
* Presone ID: Paul
* --- Paul order 1
* ------------------------
*
Concat
列表,按PersonId
分组,然后为每个组创建一个人并连接顺序:
L1.Concat(L2)
.GroupBy(x => x.Id)
.Select(x => new Person
{
Id = x.Key,
Orders = x.SelectMany(g => g.Orders).ToList()
}).ToList();
您不需要在此处Union
,因为您不想删除重复项。即使您的比较器有效,它也会删除重复的人,您将失去Orders
。您需要按其 ID 分组的所有Persons
。然后,一旦您获得组,您可以轻松地将组中所有人员的订单放入列表中。