2012-11-07 40 views
0

請考慮這樣的情景:如何自定義組通過根據一些標準的多條記錄

我的數據是這樣的:

Id   Group   Value 
----------------------------------- 
1   1    100 
2   1    120 
3   1    100 
4   2    90 
5   2    105 
6   3    300 
7   4    123 
8   4    110 
9   5    100 
10   5    110 

我想在這個數據做GroupBy1,2,3發生在一組, 4,5放置在另一個組中。我怎麼能這樣做LINQ

感謝


編輯1)

我希望把1,2,3在一組,4,5在另一組並對其執行Count聚集和我得到爲第一組和 for secnd group

回答

2

這個怎麼樣?

 int[] groupA = { 1, 2, 3 }; 
     int[] groupB = { 4, 5 }; 

     var result = data 
      .GroupBy(a => groupA.Contains(a.Group) ? "A" : 
          groupB.Contains(a.Group) ? "B" : 
          "N/a") 
      .Select(a => new 
      { 
       KEY = a.Key, 
       VALUE = a.Count() 
      }); 
+0

你可以在'LINQ Syntax'中編寫代碼嗎?我的意思是'從...中選擇...'謝謝 – Arian

0

因此g分組的規則是完全不清楚,你只需要計數的項目,我認爲你根本不需要分組

int[] groups = { 1, 2, 3 }; // or { 4, 5 } for other groups 
var groupsCount = items.Where(i => groups.Contains(i.Group)) 
         .Count(); 

你可以把這個查詢轉換方法(假設項目是場)

int GetItemsCountInGroups(params int[] groups) 
{ 
    return items.Where(i => groups.Contains(i.Group)) 
       .Count(); 
} 

使用

int count = GetItemsCountInGroups(1, 2, 3); // 6 
int anotherCount = GetItemsCountInGroups(4, 5); // 4 
0

在你想要的映射函數這種情況下1,2,31讓說4,52可以這麼說,那麼func<int,int> grouper = i => (i -1)/3應該適合你這個數據集的目的。

LINQ的則是:

var result = data.GroupBy(r => (r.Group-1)/3, 
          g => g.Count()); 

注意:如果這是要完成你需要小心,因爲除法運算符,只要你想可能不會映射數據庫方面。即在c#int除法返回一個int,所以給你的分數的整數部分,而數據庫可能會返回一個雙因此打破想要的分組。在這種情況下,您將需要類似r => ((r.Group -1) - (r.Group -1) %3)/3的東西。

相關問題