2010-10-26 106 views
5

我想实现类似于this的操作。但我不知道我能以何种方式使用该解决方案。根据LINQ的条件将一个集合拆分成几部分?

我的实体具有这些属性

CustomerName 
Date 
SortOrder 

我有这个实体的完整列表。我想要做的是,组列表<所有这些项目>具有连续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} 

     } 
    }; 

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

+2

这将极大地帮助,如果你能有一个小数据样本,以及你希望这些数据到底是什么看起来像一旦它被分组。 – diceguyd30 2010-10-26 12:17:51

+0

@ diceguyd30!我已更新问题 – IsmailS 2010-10-26 12:37:28

+0

为什么现在放置在与其他客户“Abc”订单相同的列表中的两个底行(CustomerName为“Abc”和DateTime为Today)? – 2010-10-26 12:42:34

回答

5

这里是一个可能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)) 
     ) 
+0

+1非常感谢。现在离开家。明天会尝试。 – IsmailS 2010-10-26 13:12:27

+0

你太棒了!它令人惊叹!你为我节省了很多头痛和时间。我很感激你。 – IsmailS 2010-10-27 12:06:16

+0

没问题!很高兴工作! – diceguyd30 2010-10-27 12:15:44