2012-01-28 4 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); 

Это будет возвращать что-то вроде этого:

{типа1, 13} {типа2 , 26}

и так далее.

Но как я могу рассчитывать на Subitem?

Чтобы вернуть что-то вроде: {subitem1, 15} {subitem2, 46}

+0

Могли бы вы мольбы e скажите нам, что такое числа за subitem1 и subitem2 в вашем примере? Являются ли эти пункты пунктов или подпунктов? Вы хотите подсчитать количество элементов, имеющих subitem1 в списке подэлементов (массив)? –

+0

Да! Это подсчеты. В примере есть 15 элементов, которые имеют subitem1 во всей коллекции элементов. – programad

ответ

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. То, что вы делаете, - это сгладить подпункты и подсчитать их. В этом случае нет аналогии с тем, что автор вопроса делал с типами. Он группировался по типу и подсчитывал предметы (а не подпункты). –

+0

@ achitaka-san: пример Mhh OP заставил меня поверить в то, что он хотел - может быть, если OP может прояснить – BrokenGlass

+0

Разве это не законный C# из-за имен? Это просто пример. Мои имена не являются Item - это «Ответ», а Subitems - «Устройства». Группировка типов была всего лишь примером. Этот код решил мою проблему. Спасибо, парни. – programad