Можно ли использовать Linq для получения общего количества элементов в списке списков?


У нас есть простая структура, которая представляет собой просто список списков, вот так...

var fooInfo = new List<List<Foo>>();

Мне интересно, есть ли простой способ использовать linq, чтобы вернуть общее количество всех элементов из внутренних списков. Например, если бы у нас было вот это...

fooInfo.add(new List<Foo>()); // First list within the outer list
fooInfo.add(new List<Foo>()); // Second list within the outer list
fooInfo.add(new List<Foo>()); // Third list within the outer list

// Add two items to the first inner list
fooInfo[0].add(new Foo());
fooInfo[0].add(new Foo());

// Add one item to the second inner list
fooInfo[1].add(new Foo());

// Add four items to the third inner list
fooInfo[2].add(new Foo());
fooInfo[2].add(new Foo());
fooInfo[2].add(new Foo());
fooInfo[2].add(new Foo());

...у нас будет три списка с двумя, одним и четырьмя элементами соответственно, то есть всего объектов " Foo " будет семь. Это число я надеюсь получить через linq вместо того, чтобы писать наш собственный циклический код и вручную подсчитывать их вверх.

Например

var totalFoos = fooInfo.LINQToGetTotalFoos();

Скорее, чем....

int totalFoos = 0;

foreach(var childList in fooInfo)
    totalFoos += childList.Count();
2 9

2 ответа:

Простое Перечисляемое.Сумма была бы достаточной.

var totalFoos = fooInfo.Sum(childList => childList.Count); 
Он вычисляет сумму последовательности значений Int32, полученных путем вызова функции преобразования для каждого элемента входной последовательности.

Вы можете использовать SelectMany, но производительность этого будет лучше.

Используйте SelectMany и Count:

var nbOfItems = source.SelectMany(x => x).Count();

Или Select, Count и Sum:

var nbOfItems = source.Select(x => x.Count()).Sum();
Последний будет работать лучше, потому что он не будет перечислять все пункты, как SelectMany будет.