2010-12-16 4 views
3

유일한 요소가있는 sequentce가이 함수에 전달 될 때까지 모든 것이 잘 작동합니다. 재생하는 가장 간단한 방법은 다음과 같습니다Enumerable.Aggregate error

var sumOfSquares = Enumerable.Range(5, 1).Aggregate((s, i) => s + i*i); 
// sumOfSquares == 5 

내가 시퀀스는 하나의 요소 만 포함 된 경우 집계이 버전의 경우에 예외를 발생한다고 생각합니다. 내가 놓친 몇 가지 세부 사항이 맞습니까?

답변

4

적절한 시드를 제공하고 내가 원하는 결과를 얻을 수있는 또 다른 오버로드가 있습니다. 이 코드

var sumOfSquares = Enumerable.Range(5, 1).Aggregate(0, (s, i) => s + i * i); 

, 0 i 현재 항목이다 s가 누적 값이고, 초기 시드이다. 이것은 25 (5, 2) 61을 생산하는 값 (5, 3) (110) 생산 등을 생산

+0

감사합니다 :-),하지만 내 메시지를 만들기 전에 해 봤습니다. –

7

그게 실패하지 않아야합니다. documentation에 따르면 :

초기 집계 값으로 첫 번째 요소가 사용됩니다.

그래서이 경우에는 첫 번째 요소 인 back (5) 만 얻고 집계는 수행되지 않습니다. 오류가 없습니다.

Anthony Pegram이 지적한 것처럼 another overload입니다. 여기에서 집계의 시드 값을 지정할 수 있습니다. 씨앗을 0으로 설정하면 원하는 답변 인 25를 얻을 수 있습니다.

var sumOfSquares = Enumerable.Range(5, 1).Aggregate(0, (s, i) => s + i * i); 

여기에서 물론 집계를 사용하면 안됩니다. 대신 합계를 사용할 수 있습니다.

var sumOfSquares = Enumerable.Range(5, 1).Sum(i => i * i); 

비록 단순화 된 예일뿐입니다.

+0

에 사실 대답은 0 + 5 * 5 = 25 – juharr

+0

@juharr 될 것이다 : 내 대답은 이전에 잘못이었다. 문서를 확인한 후 업데이트했습니다. –

+0

@ 마크 바이어스 : 안타깝게도 Anthony Pegrams의 대답을 복사하는 것은 그리 좋지 않습니다. – VVS

0

왜 그렇습니까? 하나의 숫자의 합계를 취하는 것은 완전히 유효합니다. 호출자가 예외를 방지하기 위해

또한, 그는 같은 것을 할 필요가있을 것이다 :

public double MySum(IEnumerable<double> seq) { 
    switch (seq.Count()) { 
     case 0: return 0.0; 
     case 1: return seq.First(); 
     default: return seq.Aggregate((s, i) => s + i); 
    } 
} 

도 두 번 순서를 전달해야 호출의 전체 많이 (또는 적어도 2 개의 첫 번째 요소).

+0

집계 함수를 생성하고 집계에 전달했습니다. 'sequence.Aggregate (SomeFunction)'와 모든 항목의 길이에 대해 잘 작동합니다. 그런 다음 예를 들어 며칠 후 SomeFunction을 수정합니다. 당신은 무엇을해야합니까? SomeFunction에 대한 모든 참조를 찾아서 집계 때문에 수정해야합니다. –

0

당신은 (훌륭한 예를 들어 안토니 Pegram의 답변을 참조) 다음 Aggregate 기능은 하나를 IEnumerable 거의 아무것도하지 않는 씨앗을 제공하지 않는 경우 목. 시퀀스의 첫 번째 요소가 시드가되고 IEnumerable에 추가 항목이 없으면 어떻게 될 것입니까? 따라서 지정된 시드가 없으면 Aggregate 함수는 첫 번째 요소의 값을 반환합니다. 그 Enumerable.Range(5,2)

var c = 0; 
var result = Enumerable.Range(5,1).Aggregate((acc,x) => acc + (x/c)); 
//result == 5 

변경하고 즉시 오류 '0으로 나누기'는 예외 : 당신은 정말 컴파일하고 실행하는 다음 코드를 사용하여 작업에서 볼 수 있습니다.

참조 : msdn '비고'섹션

+0

... 그리고 Mark는 그의 답변을 40 초 전에 업데이트 할 수 있습니다.^_^ – diceguyd30

+0

실제로 MSDN은 다음과 같이 알려야합니다. "이 방법은 시퀀스에 요소가 하나 또는없는 경우를 제외하고 소스의 각 요소에 대해 func을 한 번 호출하여 작동합니다." –

+0

@ Mad Hollander Agreed. 함수의 '특수한 경우'에 대해서는 확실히 분명히 알 수 있습니다. – diceguyd30