2011-09-18 27 views
6

tôi có mã nàyLàm thế nào để kết hợp hai hoạt động Sum thành một bằng LINQ?

Dim sum As Integer = scores.Sum(Function(score) score.Fraction * score.Score) 
Dim count As Integer = scores.Sum(Function(score) score.Fraction) 

hoặc trong C#:

var sum=scores.Sum(score=>score.Fraction * score.Score); 
var count=scores.Sum(score=>score.Fraction); 

Làm thế nào tôi có thể kết hợp những VÀ đạt được điều đó bộ sưu tập được chỉ liệt kê một lần? Tôi đã tìm thấy một số ví dụ nhưng nếu tôi không nhầm họ vẫn lặp lại bộ sưu tập hai lần.

Trả lời

11
var sum = 0; 
var count = 0; 

foreach(var score in scores){ 
    sum += score.Fraction * score.Score; 
    count += score.Fraction; 
} 

... Quan điểm của tôi là, tại sao sử dụng LINQ ở tất cả - nó có nghĩa là làm cho mọi việc nhất định dễ dàng hơn, nhưng điều này không phải là dễ dàng hơn với LINQ.

+0

Tôi nghĩ rằng sự lóa mắt phải nhường chỗ cho khả năng đọc ở đây ;-) – Dabblernl

10

Bạn có thể làm điều đó với Aggregate, mặc dù đó là một chút của một nỗi đau - và tạo ra một đối tượng bổ sung cho mỗi lần lặp:

var sums = scores.Aggregate(new { Sum = 0, Count = 0 }, 
    (current, item) => new { Sum = current.Sum + item.Score * item.Fraction, 
           Count = current.Count + item.Fraction }); 

Rõ ràng bạn có thể làm này hiệu quả hơn bằng cách tạo ra một cấu trúc ValueTuple<T1, T2> - như tuple , nhưng như một cấu trúc.

EDIT: Tôi đồng ý với điểm của Petar - nếu đây là tất cả bạn cần làm, thì LINQ không thực sự hữu ích trong trường hợp này.

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