Split a collection into parts based on condition with LINQ?
I want to achieve something similar to this. But I don't know in what manner I can use that solution.
My entity has these properties
CustomerName
Date
SortOrder
I've whole list of this Entity. What I want to do is,开发者_开发百科 group all those items in List<> which have consecutive SortOrder and same Date and same CustomerName
Example input
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}
};
Example output
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}
}
};
UPDATE
Non-LINQ solution will also suffice.Here's one possible LINQ answer, though I'm sure a more efficient one exists:
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))
)
精彩评论