2014-07-14 19 views
7

Chúng tôi có một cấu trúc đơn giản mà chỉ là một danh sách liệt kê, như vậy ...Có thể sử dụng LINQ để nhận tổng số mục trong danh sách các danh sách không?

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

Tôi tự hỏi nếu có một cách đơn giản chúng ta có thể sử dụng LINQ để trả lại tổng cộng tất cả các mục từ bên trong danh sách. Ví dụ: nếu chúng tôi có điều này ...

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()); 

... chúng tôi sẽ có ba danh sách với hai, một và bốn mục tương ứng, có nghĩa là tổng số đối tượng 'Foo' là bảy. Đó là con số tôi hy vọng sẽ lấy qua linq thay vì phải viết mã vòng lặp của chúng ta và kiểm tra chúng theo cách thủ công.

ví dụ:

var totalFoos = fooInfo.LINQToGetTotalFoos(); 

hơn ....

int totalFoos = 0; 

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

Trả lời

9

Một đơn giản Enumerable.Sum sẽ đủ.

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

Nó tính tổng của chuỗi giá trị Int32 thu được bằng cách gọi hàm biến đổi trên mỗi phần tử của chuỗi đầu vào.

Bạn có thể sử dụng SelectMany nhưng hiệu suất của việc này sẽ tốt hơn.

5

Sử dụng SelectManyCount:

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

hoặc Select, CountSum:

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

Sau này sẽ thực hiện tốt hơn, bởi vì nó sẽ không liệt kê tất cả các mục như SelectMany sẽ.

+0

@NikhilAgrawal 'Có thể đếm được .Count()' kiểm tra nếu đích thực hiện 'ICollection ' (và do đó có thuộc tính 'Đếm') và sử dụng nó nếu có. – MarcinJuraszek

+0

Có. Điểm hợp lệ. Mối quan tâm của tôi là sử dụng 'List.Count' thay vì' IEnumerable.Count'. Điều đó sẽ làm cho truy vấn của bạn nhẹ hơn. –

+0

Đọc http://stackoverflow.com/questions/981254/is-the-linq-count-faster-or-slower-than-list-count-or-array-length này –

Các vấn đề liên quan