2012-01-28 245 views
0

我有一個具有子集合的類。事情是這樣的:LINQ嵌套集合

public class Item { 
    public string Type {get;set} 
    public Subitem[] {get;set;} 
} 

我知道,我可以單獨和按類型統計是這樣的:

var count = (from x in items 
      group x by x.Type into grouped 
      select new { 
       typename = grouped.Key, 
       count = grouped.Count() 
       }).ToDictionary<string, int>(x => x.typename, x => x.count); 

這將返回是這樣的:

{TYPE1,13} {2型,26}

等等。

但是我怎樣才能通過Subitem來計算?

返回類似: {的SubItem1,15} {subitem2,46}

+0

莫非你認罪告訴我們在你的例子中subitem1和subitem2的數字是什麼?這些項目或子項目的計數? 是否要計算子項目列表(數組)中具有子項目1的項目數? – 2012-01-28 23:52:24

+0

是的!這些都是重要的。在該示例中,在整個Items集合中有15個項目具有subitem1。 – programad 2012-01-29 00:11:12

回答

2

你的代碼示例是不合法的C#,但假設你有一個名爲在您的項目Subitems集 - 那麼你可以使用SelectMany()或查詢語法:

var count = (from i in items 
      from x in i.Subitems 
      group x by x into grouped 
      select new 
      { 
       typename = grouped.Key, 
       count = grouped.Count() 
       }).ToDictionary(x => x.typename, x => x.count); 

或可替代的方法的語法:

var countDict = items.SelectMany(x => x.Subitem) 
        .GroupBy(x => x) 
        .ToDictionary(g => g.Key, g => g.Count()); 
+1

嗨@BrokenGlass。你做什麼是你壓扁子項目和數它們。在這種情況下,類型問題的作者沒有類比。他按類型和計數項目(不是子項目)進行分組。 – 2012-01-28 23:51:11

+0

@ achitaka-san:Mhh OP的例子讓我相信這就是他想要的 - 也許如果OP可以澄清 – BrokenGlass 2012-01-28 23:54:57

+0

由於名稱,它不是合法的C#嗎?這只是一個例子。我的名字不是項目是「答案」,子項目是「設備」。類型分組只是一個例子。這段代碼解決了我的問題。多謝你們。 – programad 2012-01-29 00:18:50