2011-09-18 2 views
6

내가 가진이 코드두 합계 연산을 LINQ를 사용하여 하나로 결합하는 방법은 무엇입니까?

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

또는 C#에서 :

나는이 병합 및 수집 한 번만 열거되는 것을 달성 할 수있는 방법
var sum=scores.Sum(score=>score.Fraction * score.Score); 
var count=scores.Sum(score=>score.Fraction); 

? 몇 가지 예제를 찾았지만 실수가 아니라면 컬렉션을 두 번 반복합니다. 각 반복에 대한 별도의 객체 생성 - 그것이 고통의 비트가 비록

답변

11
var sum = 0; 
var count = 0; 

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

... 요점은 LINQ를 사용하는 이유는 무엇인가? 더 쉽게하기위한 것이지만 LINQ에서는 쉽지 않습니다.

+0

나는 눈을 가볍게 여기에 가독성을 부여해야한다고 생각한다 ;-) – Dabblernl

10

당신은 Aggregate 함께 할 수 있습니다하십시오 ValueTuple<T1, T2> 구조체를 만들어

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

은 분명히이보다 효율적으로 만들 수를 - 같은 튜플 ,하지만 구조체로.

편집 : Petar의 요점에 동의합니다. 모두 일 경우 LINQ는 실제로이 상황에서 도움이되지 않습니다.

관련 문제