Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在c中相交列表?_C#_Linq - Fatal编程技术网

C# 如何在c中相交列表?

C# 如何在c中相交列表?,c#,linq,C#,Linq,我有以下c中的Item对象列表: public class Item { public int Id { get; set; } public List<string> Orders { get; set; } } List<Item> item = 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> item = 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" }},
               new Item() { Id = 1, Code = 23, Orders = new List<string>() { "E", "F" }},
               new Item() { Id = 3, Code = 25, 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' },
      new Item() { Id = 3, Code = 25, Orders = new List<string>() { 'G', 'H' }
    };

如果可能的话,如何在c语言中使用linq高效地执行此操作?

您可以根据项目id对项目进行分组,然后为每个id创建新项目连接订单:

item.GroupBy(x => x.Id)
    .Select(x => new Item
                 { 
                      Id = x.Key,     
                      Orders = x.SelectMany(a => a.Orders).ToList()
                  }).ToList();

您可以按项目id对项目进行分组,然后为每个id创建新项目并连接订单:

item.GroupBy(x => x.Id)
    .Select(x => new Item
                 { 
                      Id = x.Key,     
                      Orders = x.SelectMany(a => a.Orders).ToList()
                  }).ToList();

看起来你想要的是这样的:

var output = items.GroupBy(i => i.Id)
                  .Select(g => new Item() 
                          {
                              Id = g.Key
                              Orders = g.SelectMany(i => i.Orders)
                                        .ToList()
                          });
或在查询语法中:

var output = 
    from i in items
    group i by i.Id into g
    select new Item() 
           {
               Id = g.Key
               Orders = g.SelectMany(i => i.Orders).ToList()
           };

看起来你想要的是这样的:

var output = items.GroupBy(i => i.Id)
                  .Select(g => new Item() 
                          {
                              Id = g.Key
                              Orders = g.SelectMany(i => i.Orders)
                                        .ToList()
                          });
或在查询语法中:

var output = 
    from i in items
    group i by i.Id into g
    select new Item() 
           {
               Id = g.Key
               Orders = g.SelectMany(i => i.Orders).ToList()
           };

您希望根据项目ID对项目进行分组,然后根据该组的所有订单创建新序列

var query = items.GroupBy(item => item.Id)
    .Select(group => new Item
    {
        Id = group.Key,
        Orders = group.SelectMany(item => item.Orders).ToList()
    });

请注意,这不是任何数据的交集。您将获得每个组中所有数据的并集。

您希望根据项目ID对项目进行分组,然后根据该组的所有订单创建新序列

var query = items.GroupBy(item => item.Id)
    .Select(group => new Item
    {
        Id = group.Key,
        Orders = group.SelectMany(item => item.Orders).ToList()
    });

请注意,这不是任何数据的交集。您正在获得每个组中所有数据的并集。

您的代码无法编译。@presiuslitelsnoflek我知道-1,因为您使我们更难帮助您。我说的是上面的代码片段,不是下面的one@presiuslitelsnoflek但是代码只是一个例子,你的代码无法编译。@presiuslitelsnoflek我知道-1,因为你让我们更难帮助你。我说的是上面的代码片段,不是下面的one@presiuslitelsnoflek但是代码只是一个例子,这是一个串联或联合,都是SQL术语。一个工会需要一个与众不同的组织。不清楚OP想要哪种变体。@OlivierJacot Descombes是的,它可能是基于列表的并集,而不是基于集合的并集。两者都是很容易实现的。我使用工会的方式更为普遍sense@Servy我在Item对象中还有一些其他属性,如DateTime、Ids等,这些属性将如何复制到您在SELECT???@user1740381中创建的新Item对象中。如果您在结果中需要这些属性,您需要手动复制它们。您需要找到一些逻辑方法来聚合它们;通过确保将这些成员的不同值放在不同的组中,也就是这些字段上的组,或者以某种方式组合不同的结果。可能类似于Code=group.Firstitem=>item.Code就可以了。备选方案:GroupByitem=>new{item.Id,item.Code},然后Id=group.Key.Id,Code=group.Key.Code。这是SQL术语中的串联或并集。一个工会需要一个与众不同的组织。不清楚OP想要哪种变体。@OlivierJacot Descombes是的,它可能是基于列表的并集,而不是基于集合的并集。两者都是很容易实现的。我使用工会的方式更为普遍sense@Servy我在Item对象中还有一些其他属性,如DateTime、Ids等,这些属性将如何复制到您在SELECT???@user1740381中创建的新Item对象中。如果您在结果中需要这些属性,您需要手动复制它们。您需要找到一些逻辑方法来聚合它们;通过确保将这些成员的不同值放在不同的组中,也就是这些字段上的组,或者以某种方式组合不同的结果。可能类似于Code=group.Firstitem=>item.Code就可以了。备选方案:GroupByitem=>new{item.Id,item.Code},然后Id=group.Key.Id,Code=group.Key.Code。