2017-03-29 33 views
-3

我需要獲得主題名稱和次數(計數)一個給定的主題發生。Linq group by和得到發生次數

例子:

Name: John 
Topic: X, Y, Z => these are List<string> 

Name: Bob 
Topic: Y 

Name: Suzy 
Topic: Y, Z 

Should generate output: 
X: 1 
Y: 3 
Z: 2 

我已經試過,但它不返回正確的結果:

var result = from r in items 
         orderby r.Topic 
         group r by r.Topic 
       into grp 
         select new { key = grp.Key, cnt = grp.Count() }; 
+2

「它不會返回正確的結果」 - 這是從來沒有足夠的信息。它有什麼作用?你能提供一個[mcve]證明這一點嗎? (我們甚至無法知道目前代碼中的數據是什麼樣子。) –

+2

分組之前的排序要點是什麼? –

+1

@EricLippert它會影響組內項目的順序,因爲'GroupBy'確保組中的項目與原始順序中的項目具有相同的相對順序。至少對於'IEnumerable'實現。當然,這段代碼似乎並不關心組中項目的順序,但它至少*有時是明智的。 – Servy

回答

0

您可以拉平與其他from所包含的集合:

var result = from r in lineItems 
      from t in r.Topic // List<string> 
      group t by t into grp 
      orderby grp.Key 
      select new { key = grp.Key, cnt = grp.Count() }; 
+0

主題已在列表中表單中。對不起 – BobSwanson

+0

@BobSwanson:編輯 –

+0

如果orderby位於繼續查詢中,查詢效率更高。你明白爲什麼? –

0

我喜歡用SelectMany來做這件事(爲了展平內藏品) 只是另一種方式來做到這一點

var result = items.SelectMany((w) => w.Topic) 
        .GroupBy((q) => q) 
        .Select((p) => new { Grp = p.Key, Cnt = p.Count() }) 
        .OrderBy((g) => g.Cnt);