2011-09-02 77 views
145

這是很簡單,但我很茫然: 鑑於這種類型的數據集:LINQ與GROUPBY和計數

UserInfo(name, metric, day, other_metric) 

和這個樣本數據集:

joe 1 01/01/2011 5 
jane 0 01/02/2011 9 
john 2 01/03/2011 0 
jim 3 01/04/2011 1 
jean 1 01/05/2011 3 
jill 2 01/06/2011 5 
jeb 0 01/07/2011 3 
jenn 0 01/08/2011 7 

我d想要檢索一個表,按照(0,1,2,3 ..)的順序列出指標的總數並記錄計數。所以從這個集合你最終用:

0 3  
1 2  
2 2  
3 1 

我與LINQ語法拼殺,但我被困在那裏放了GROUPBY和計數.... 任何幫助?

POST編輯:我從來沒有能夠得到發佈的答案工作,因爲他們總是返回一個記錄與不同計數的數量。但是我能夠把一個LINQ to SQL的例子做了工作:

 var pl = from r in info 
       orderby r.metric  
       group r by r.metric into grp 
       select new { key = grp.Key, cnt = grp.Count()}; 

這個結果給了我一組有序的記錄與「指標」,並與各相關用戶的數量。對於LINQ來說,我顯然是新手,對於未經訓練的人來說,這種方法看起來與純LINQ方法非常相似,但給了我一個不同的答案。

+0

是的,但是吉米的解釋對我更有幫助。然而,我從來沒有得到他的榜樣工作,但它確實帶領我邁向一個新的方向。 – Gio

回答

254

調用GroupBy後,你會得到一個系列組IEnumerable<Grouping>,其中每個分組本身暴露了用於創建組Key的,也就是不管項目是在原始數據集的IEnumerable<T>。您只需在該分組上撥打Count()即可獲得小計。

foreach(var line in data.GroupBy(info => info.metric) 
         .Select(group => new { 
          Metric = group.Key, 
          Count = group.Count() 
         }) 
         .OrderBy(x => x.Metric) 
{ 
    Console.WriteLine("{0} {1}", line.Metric, line.Count); 
} 


這是一個出色的快速回復,但我有一個有點問題的第一行,特別是 「data.groupby(資訊=> info.metric)」

一些 class,看起來像

class UserInfo { 
    string name; 
    int metric; 
    ..etc.. 
} 
... 
List<UserInfo> data = ..... ; 

我假設你已經有一個列表/陣列

當你data.GroupBy(x => x.metric),它的意思是「由data定義的每個元素在x了IEnumerable,計算它的.metric,然後組都具有相同的度量中的元素變成Grouping並返回所有所得組的IEnumerable。鑑於

<DATA>   | Grouping Key (x=>x.metric) | 
joe 1 01/01/2011 5 | 1 
jane 0 01/02/2011 9 | 0 
john 2 01/03/2011 0 | 2 
jim 3 01/04/2011 1 | 3 
jean 1 01/05/2011 3 | 1 
jill 2 01/06/2011 5 | 2 
jeb 0 01/07/2011 3 | 0 
jenn 0 01/08/2011 7 | 0 

您的示例數據集中,將導致GROUPBY後的結果如下:

(Group 1): [joe 1 01/01/2011 5, jean 1 01/05/2011 3] 
(Group 0): [jane 0 01/02/2011 9, jeb 0 01/07/2011 3, jenn 0 01/08/2011 7] 
(Group 2): [john 2 01/03/2011 0, jill 2 01/06/2011 5] 
(Group 3): [jim 3 01/04/2011 1] 
+0

這是一個非常快速的回覆,但我在第一行遇到了一些問題,特別是「data.groupby(info => info.metric)」。顯然'數據'是當前的數據集,但'info.metric'代表什麼?類定義? – Gio

+0

「info.metric」將是您在問題中提到的UserInfo類的度量屬性/字段。 –

+1

非常感謝,但實際上這似乎給了我一個單一的值 - 即不同度量計數的總數。在這個例子中,我得到了「度量4」,它向我表明了我有多少不同的計數。 – Gio

13
userInfos.GroupBy(userInfo => userInfo.metric) 
     .OrderBy(group => group.Key) 
     .Select(group => Tuple.Create(group.key, group.Count())); 
26

假設userInfoListList<UserInfo>

 var groups = userInfoList 
      .GroupBy(n => n.metric) 
      .Select(n => new 
      { 
       MetricName = n.Key, 
       MetricCount = n.Count() 
      } 
      ) 
      .OrderBy(n => n.MetricName); 

lambda函數對於GroupBy()n => n.metric mea ns,它將從每遇到UserInfo對象獲得字段metricn的類型取決於上下文,首次出現時它的類型爲UserInfo,因爲該列表包含UserInfo對象。第二次出現n的類型爲Grouping,因爲現在它是一個Grouping對象的列表。

Grouping s有擴展方法,如.Count(),.Key()和幾乎任何你所期望的。就像您在string上檢查.Lenght一樣,您可以在組上檢查.Count()