2010-10-26 103 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