我们有一个简单的结构,它只是一个列表列表,就像这样......
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检索的数字,而不是必须编写我们自己的循环代码并手动计算它们。
e.g。
var totalFoos = fooInfo.LINQToGetTotalFoos();
而不是......
int totalFoos = 0;
foreach(var childList in fooInfo)
totalFoos += childList.Count();
答案 0 :(得分:13)
一个简单的Enumerable.Sum就足够了。
var totalFoos = fooInfo.Sum(childList => childList.Count);
它计算通过在输入序列的每个元素上调用转换函数获得的Int32值序列的总和。
您可以使用SelectMany
但效果会更好。
答案 1 :(得分:8)
使用SelectMany
和Count
:
var nbOfItems = source.SelectMany(x => x).Count();
或Select
,Count
和Sum
:
var nbOfItems = source.Select(x => x.Count()).Sum();
后者会表现得更好,因为它不会枚举SelectMany
之类的所有项目。