C# 如何在c中合并来自不同列表的2个对象?

C# 如何在c中合并来自不同列表的2个对象?,c#,linq,C#,Linq,我在c中有以下两个Item对象列表: public class Item { public int Id { get; set; } public List<string> Orders { get; set; } } List<Item> items1 = new List<Item>() { new Item() { Id = 1, Code = 23, Orders = new List<string>() {

我在c中有以下两个Item对象列表:

public class Item
{
    public int Id { get; set; }
    public List<string> Orders { get; set; }
}

List<Item> items1 = new List<Item>() { 
      new Item() { Id = 1, Code = 23, Orders = new List<string>() { "A", "B" }},
      new Item() { Id = 2, Code = 24, Orders = new List<string>() { "C", "D" }}
};

List<Item> items2 = new List<Item>() { 
      new Item() { Id = 1, Code = 23, Orders = new List<string>() { "E", "F" }},
      new Item() { Id = 2, Code = 24, Orders = new List<string>() { "G", "H" }}
};
我想合并Id和代码相同的两个列表中的项目对象,因此上述两个列表的输出应该是具有以下条目的单个列表:

{ 
  new Item() { Id = 1, Code = 23, Orders = new List<string>() { 'A', 'B', 'E', 'F' },
  new Item() { Id = 2, Code = 24, Orders = new List<string>() { 'C', 'D', 'G', 'H' }
};

如何使用linq在c中实现这一点?

您可以加入这两个列表,然后合并它们的顺序,如:

您将获得:


如果您需要连接订单,则可以使用Concat替换Union。因此,如果您的订单包含A、B和A、F,那么使用concat,您将得到A、B、A、F,使用Union,您将得到A、B、F,但不重复,在前面的问题中,只有1个列表,而在这个问题中,列表是2。然后,您的问题变成如何将两个不同列表中的项目合并到一个列表中,你刚才的问题回答了这个问题。我相信你能想出如何用两个集合中的项创建一个新的列表/枚举,如果没有,谷歌可以告诉你如何创建。使用linq语法也可以做到这一点吗?@user1740381 linq不是语法,它是System.linq命名空间中的方法集合。也许你指的是方法语法,答案是肯定的,所有的查询语法表达式都被翻译成方法语法;如果你愿意,你可以自己翻译。
List<Item> combined = (from t in items1
                       join r in items2 on new { t.Id, t.Code } equals new { r.Id, r.Code }
                       select new Item
                       {
                           Id = t.Id,
                           Code = t.Code,
                           Orders = t.Orders.Union(r.Orders).ToList()

                       }).ToList();
var result = from x in items1
             join y in items2 on x.Id equals y.Id
             select new Item
                {
                    Id = x.Id, 
                    Code = x.Code,
                    Orders = x.Orders.Concat(y.Orders).ToList()
                };