2015-09-27 4 views
0

У меня есть следующая проблема:Как получить отдельные значения из вложенных списков объектов?

foo f = new foo(); 
// ... 
f.bars.SelectMany(m => m.qux.GroupBy(x => x.hash)) 
     .Select(group => group.First()) 
     .Sum(s => s.size); 

Это возвращает сумму общего size имущества для qux в случае в одного бара. Добавление другого объекта qux с существующим значением hash в другом bar игнорируется, поэтому его значение size подсчитывается в вычисленной сумме. (Даже тот же qux существует в другом bar объект).

Как я могу настроить свой запрос, чтобы убедиться, что все объекты, имеющие одинаковые hash, вычисляются один раз?

Структура данных будет выглядеть следующим образом:

class foo 
{ 
    public List<bar> bars = new List<bar>(); 
} 

class bar 
{ 
    public List<qux> qux = new List<qux>(); 
} 

class qux 
{ 
    public string hash { get; set; } 
    public int size { get; set; } 
} 
+1

Просьба предоставить информацию о структуре данных, с которыми вы работаете. –

+0

@DmytroShevchenko, foo имеет много баров (список ), и бары имеют много qux (список ). Qux имеет два свойства (размер и хэш). – user1027620

+0

'foo.SelectMany()' не имеет смысла, поскольку 'foo' не является коллекцией. –

ответ

0

Судя по вашей структуре данных, вот что вам нужно:

int sizeSum = 
    bars.SelectMany(m => m.qux) 
     .GroupBy(q => q.hash) 
     .Select(g => g.First()) 
     .Sum(q => q.size); 

Разницы с исходным раствором является то, что мы сначала получаем единый список с .SelectMany() и только тогда мы сгруппируем его по hash.

+1

Спасибо за объяснение. Ваше решение работает. – user1027620

Смежные вопросы