Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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# 使用LINQ根据条件将集合拆分为多个部分?_C#_.net_Linq_Grouping - Fatal编程技术网

C# 使用LINQ根据条件将集合拆分为多个部分?

C# 使用LINQ根据条件将集合拆分为多个部分?,c#,.net,linq,grouping,C#,.net,Linq,Grouping,我想取得类似的成就。但我不知道我能以什么方式使用这个解决方案 我的实体具有这些属性 CustomerName Date SortOrder 我有这个实体的完整列表。我想做的是,将列表中具有连续排序顺序、相同日期和相同客户名称的所有项目分组 示例输入 var inv = new List<Invoice>(){ new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 0}, n

我想取得类似的成就。但我不知道我能以什么方式使用这个解决方案

我的实体具有这些属性

CustomerName
Date
SortOrder
我有这个实体的完整列表。我想做的是,将列表中具有连续排序顺序、相同日期和相同客户名称的所有项目分组

示例输入

  var inv = new List<Invoice>(){
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 0},
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 1},
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 2},
    new Invoice(){ CustomerName = "xyz" ,Date = DateTime.Today.Subtract(TimeSpan.FromDays(1)), SortOrder = 3},
    new Invoice(){ CustomerName = "xyz" ,Date = DateTime.Today.Subtract(TimeSpan.FromDays(1)), SortOrder = 4},
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 5},
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 6}
  };
  var invGrouped = new List<List<Invoice>>
   {
     new List<Invoice>
       {
         new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 0},
         new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 1},
         new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 2}
       },
     new List<Invoice>
       {
         new Invoice {CustomerName = "xyz", Date = DateTime.Today.Subtract(TimeSpan.FromDays(1)), SortOrder = 3},
         new Invoice {CustomerName = "xyz", Date = DateTime.Today.Subtract(TimeSpan.FromDays(1)), SortOrder = 4}
       },
     new List<Invoice>
       {
         new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 5},
         new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 6}

       }
   };
var inv=新列表(){
新发票(){CustomerName=“Abc”,日期=日期时间。今天,排序器=0},
新发票(){CustomerName=“Abc”,日期=日期时间。今天,排序器=1},
新发票(){CustomerName=“Abc”,日期=日期时间。今天,排序器=2},
新发票(){CustomerName=“xyz”,日期=日期时间。今天。减去(TimeSpan.FromDays(1)),排序规则=3},
新发票(){CustomerName=“xyz”,日期=日期时间。今天。减去(TimeSpan.FromDays(1)),排序器=4},
新发票(){CustomerName=“Abc”,日期=日期时间。今天,排序器=5},
新发票(){CustomerName=“Abc”,日期=日期时间。今天,排序器=6}
};
示例输出

  var inv = new List<Invoice>(){
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 0},
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 1},
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 2},
    new Invoice(){ CustomerName = "xyz" ,Date = DateTime.Today.Subtract(TimeSpan.FromDays(1)), SortOrder = 3},
    new Invoice(){ CustomerName = "xyz" ,Date = DateTime.Today.Subtract(TimeSpan.FromDays(1)), SortOrder = 4},
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 5},
    new Invoice(){ CustomerName = "Abc" ,Date = DateTime.Today, SortOrder = 6}
  };
  var invGrouped = new List<List<Invoice>>
   {
     new List<Invoice>
       {
         new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 0},
         new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 1},
         new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 2}
       },
     new List<Invoice>
       {
         new Invoice {CustomerName = "xyz", Date = DateTime.Today.Subtract(TimeSpan.FromDays(1)), SortOrder = 3},
         new Invoice {CustomerName = "xyz", Date = DateTime.Today.Subtract(TimeSpan.FromDays(1)), SortOrder = 4}
       },
     new List<Invoice>
       {
         new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 5},
         new Invoice {CustomerName = "Abc", Date = DateTime.Today, SortOrder = 6}

       }
   };
var invGrouped=新列表
{
新名单
{
新发票{CustomerName=“Abc”,日期=日期时间。今天,排序器=0},
新发票{CustomerName=“Abc”,日期=日期时间。今天,排序器=1},
新发票{CustomerName=“Abc”,日期=日期时间。今天,排序器=2}
},
新名单
{
新发票{CustomerName=“xyz”,日期=日期时间。今天。减去(TimeSpan.FromDays(1)),排序器=3},
新发票{CustomerName=“xyz”,日期=日期时间。今天。减去(TimeSpan.FromDays(1)),排序器=4}
},
新名单
{
新发票{CustomerName=“Abc”,日期=日期时间。今天,排序器=5},
新发票{CustomerName=“Abc”,日期=日期时间。今天,排序器=6}
}
};
更新

非LINQ解决方案也就足够了。

这里有一个可能的LINQ解决方案,尽管我确信存在一个更有效的解决方案:

    inv
        .GroupBy(x => new { CustomerName = x.CustomerName, Date = x.Date })
        .SelectMany(x => x
                            .OrderBy(y => y.SortOrder)
                            .Select((y,i) => new { Value = y, Sort = y.SortOrder - i })
                            .GroupBy(y => y.Sort)
                            .Select(y => y.Select(z => z.Value))
        )

如果您能够包括一个小样本数据,以及您希望数据分组后的样子,这将非常有帮助。@diceguyd30!我已经更新了问题,为什么底部的两行(客户名称为“Abc”和日期时间为今天)与今天下的另一个客户“Abc”订单不在同一个列表中?因为排序器不是连续的(缺少3和4)。这就是我希望通过询问数据和所需输出来确认的内容。@DoctaJonez@diceguyd30正确理解了它。+1非常感谢。马上回家。我明天就试试。你太棒了!它的工作令人惊讶!!!你帮我省去了很多头痛和时间。我很感谢你。