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非常感谢。马上回家。我明天就试试。你太棒了!它的工作令人惊讶!!!你帮我省去了很多头痛和时间。我很感谢你。