如何合并泛型列表及其属性

本文关键字:列表 属性 泛型 何合并 合并 | 更新日期: 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。然后,一旦您获得组,您可以轻松地将组中所有人员的订单放入列表中。