关于C#:是否可以使用LINQ获取列表中项目的总数?

Is it possible to use Linq to get a total count of items in a list of lists?

我们有一个简单的结构,它只是一个列表,就像这样…

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

我想知道是否有一种简单的方法可以使用Linq返回内部列表中所有项目的总数。例如,如果我们有这个…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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检索到的数字,而不必编写自己的循环代码并手动对它们进行计数。

例如

1
var totalFoos = fooInfo.LINQToGetTotalFoos();

而不是。。。。

1
2
3
4
int totalFoos = 0;

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


一个简单的可枚举的和就足够了。

1
var totalFoos = fooInfo.Sum(childList => childList.Count);

它计算通过对输入序列的每个元素调用转换函数获得的Int32值序列的总和。

您可以使用SelectMany,但这样的性能会更好。


使用SelectManyCount

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

SelectCountSum

1
var nbOfItems = source.Select(x => x.Count()).Sum();

后者会表现得更好,因为它不会枚举所有的项目,如SelectManywill。