2012-01-28 199 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