2014-01-22 68 views
2

我想知道如何組項目,並通過使用LINQ如何分組列表並拆分每n條記錄?

# |ITEM |QUANTITY 
================== 
1 |ITEM01| 10 
2 |ITEM01| 10 
3 |ITEM01| 10 
.  .  . 
.  .  . 
22|ITEM01| 10 
23|ITEM02| 50 
24|ITEM02| 50 

假設有23 ITEM001和2 ITEM002

名單如何獲得分拆每N記錄

ITEM |QUANTITY 
================= 
ITEM001 | 100 
ITEM001 | 100 
ITEM001 | 20 
ITEM002 | 100 

按ITEM分組,如果分組大於10,則轉到下一個

有什麼辦法可以實現它嗎?感謝您的幫助!

感謝那些好人幫忙!進一步的問題,現在我想組列表一樣(每10條記錄進行分組,分組後,如果計數未達到10,不組),對不起,我的英語不好:(

ITEM |QUANTITY 
================= 
ITEM01 | 100 
ITEM01 | 100 
ITEM01 | 10 
ITEM01 | 10 
ITEM01 | 10 
ITEM02 | 50 
ITEM02 | 50 

謝謝您再次幫助

+1

的可能重複[如何使用Linq將每N個行分組](http:// stackoverflow。com/questions/860305/how-to-use-linq-group-every-n-number-of-rows) – Rawling

+0

也許第三項應該是'ITEM001 | 30'如果你有23 ITEM001? –

+0

是的。我的打字錯誤。進一步的問題,如果計數不是> = 10,如何分組列表?結果,ITEM01:100,ITEM01:100,ITEM01:10,ITEM01:10,ITEM01:10,ITEM02:50,ITEM02:50 –

回答

2
var query = 
    items.GroupBy(item => item.Name) 
     .SelectMany(g => g.Select((item, index) => new { item, index }) 
          .GroupBy(x => x.index/10) 
          .Select(batch => new Item { 
           Name = batch.First().item.Name, 
           Quantity = batch.Sum(x => x.item.Quantity) 
          })).OrderBy(item => item.Name); 
  1. 集團所有的名字項目。這將爲您提供兩組樣本數據。
  2. 將每個組分成10個項目批次,並從每個批次中選擇新的彙總項目(批次可以包含少於10個項目,作爲ITEM001的第三批次)。
  3. 按物品名稱排序結果。

,如果你會使用MoreLINQ(可從的NuGet)批量延長或寫入該查詢可以簡化自己的一個:

var query = 
    items.GroupBy(item => item.Name) 
     .SelectMany(g => g.Batch(10) 
          .Select(batch => new Item { 
           Name = batch.First().Name, 
           Quantity = batch.Sum(item => item.Quantity) 
          })).OrderBy(item => item.Name); 

假設你有項目類這樣

public class Item 
{ 
    public string Name { get; set; } 
    public int Quantity { get; set; } 
} 

然後這個物品的示例列表(使用NBuilder構建):

var items = Builder<Item>.CreateListOfSize(32) 
         .TheFirst(23) 
          .With(i => i.Name = "ITEM01") 
          .And(i => i.Quantity = 10) 
         .TheNext(9) 
          .With(i => i.Name = "ITEM02") 
          .And(i => i.Quantity = 50) 
         .Build(); 

會給結果:

[ 
    { Name: "ITEM01", Quantity: 100 }, 
    { Name: "ITEM01", Quantity: 100 }, 
    { Name: "ITEM01", Quantity: 30 }, 
    { Name: "ITEM02", Quantity: 450 } 
] 

注:@Thejaka解決方案將會給你五個項目在這種情況下 - 將有兩個項目ITEM02與數量350和100

+0

@KonradKokosa,從樣本中我可以看到,OP希望按名稱分組的最大大小爲10的批次(即它指的是物品數量而不是總數量) –

+0

有用!但我可以再問一次嗎?如果計數不是> = 10,如何分組列表?期望結果ITEM01:100,ITEM01:100,ITEM01:10,ITEM01:10,ITEM01:10,ITEM02:50,ITEM02:50 –

0

!注意:。低於總和答案團體項目,不計儘管如此,我離開這裏以供將來參考也許有人會曾經有類似的問題

你可以實現它。以下LINQ查詢:

List<Item> items = new List<Item>() 
{ 
    new Item() { Name = "Item01", Quantity = 40 }, // 130 
    new Item() { Name = "Item01", Quantity = 70 }, 
    new Item() { Name = "Item01", Quantity = 10 }, 
    new Item() { Name = "Item01", Quantity = 10 }, 
    new Item() { Name = "Item02", Quantity = 50 }, // 100 
    new Item() { Name = "Item02", Quantity = 50 }, 
    new Item() { Name = "Item03", Quantity = 10 } // 10 
}; 

var result = 
    // Group by Name, calculate total sum for each group 
    items.GroupBy(i => i.Name, (k, v) => new Item() 
    { 
     Name = k, 
     Quantity = v.Sum(i => i.Quantity) 
    }) 
    // Split groups into 100 packages 
    .SelectMany(i => Enumerable.Range(0, (int)Math.Ceiling(i.Quantity/100.0)) 
           .Select(n => new Item() 
    { 
     Name = i.Name, 
     Quantity = i.Quantity > ((n + 1) * 100) ? 100 : i.Quantity - n * 100 
    })) 
    .ToList(); 

然後,你必須在列表中四個要素:

Item01 100 
Item01 30 
Item02 100 
Item03 10 
+0

他希望按計數拆分(每個分組只應該有10個元素),而不是按總和。 –

+0

@ledbutter,真的,顯然我誤解了這個問題。 –