2011-01-23 2 views
3

에 합계로 변환 : 나는 Aggregate를 사용하여 수학적 제품을 좀하고 싶습니다나는이 표현이 집계 제품 표현

group i by i.ItemId into g 
select new 
{ 
    Id = g.Key, 
    Score = g.Sum(i => i.Score) 
}).ToDictionary(o => o.Id, o => o.Score); 

대신 g.Sum의를.

.Sum와 동일하게 작동 확인 (하지만 제품으로) 난 그냥 합을 반환 집계 함수를 만들려고 ...

Score = g.Aggregate(0.0, (sum, nextItem) => sum + nextItem.Score.Value) 

그러나,이 같은 결과를 제공하지 않습니다 .Sum을 사용하십시오. Idas 이유는 무엇입니까?

nextItem.Scoredouble?입니다.

+3

계속 합계와 같은 결과를 얻지 못하는 이유는 계속 묻지 만 문제를 나타내는 데이터는 제공하지 않았습니다. * 우리가 컴파일, 실행 및 디버그 할 수있는 문제를 명확하게 보여주는 짧은 프로그램을 작성하십시오. –

답변

3
public static class MyExtensions 
{ 
    public static double Product(this IEnumerable<double?> enumerable) 
    { 
     return enumerable 
      .Aggregate(1.0, (accumulator, current) => accumulator * current.Value); 
    } 
} 
+0

g는 IGrouping 유형으로 IEnumerable이 아니므로 제 경우에는 작동하지 않을 것이라고 생각합니다. – Mickel

+1

그렇습니다 :'public interface IGrouping : IEnumerable , IEnumerable' –

1

것은 귀하의 예제에서 0.0로 곱셈을 시작하는 것입니다 - 제로가있는 곱셈 결과가 0이됩니다 끝에 제로를 얻을 수 있습니다.

올바른 것은 곱셈의 ID 속성을 사용하는 것입니다. 숫자에 0을 추가하면 변경되지 않은 숫자가 남지만 1을 곱하면 동일한 속성이 적용됩니다. 따라서 제품 집계를 시작하는 올바른 방법은 1.0의 곱셈을 시작하는 것입니다.

+0

예, 알고 있습니다 (오타였습니다). 그러나 잠시 동안 합계를 살펴보십시오. 어떻게 그것이 .Sum()과 같은 결과를 나타내지 않는가? – Mickel

0

집계 쿼리에서 초기 값이 확실하지 않고이 예제에서와 같이 절대적으로 필요하지 않은 경우 전혀 사용하지 않는 것이 좋습니다.

당신은 초기 값을 고려하지 않습니다 집계 과부하 사용할 수 있습니다 - item1 * (item2 * (item3 * ... * itemN))로 평가이

int product = sequence.Aggregate((x, acc) => x * acc); 

처럼 http://msdn.microsoft.com/en-us/library/bb549218.aspx

합니다. 대신 1.0 * (item1 * (item2 * (item3 * ... * itemN)))로 평가

int product = sequence.Aggregate(1.0, (x, acc) => x * acc);

.

// 편집 : 한 가지 중요한 차이가 있습니다. 입력 시퀀스가 ​​비어 있으면 이전 InvalidOperationException이 throw됩니다. 후자는 시드 값을 반환하므로 1.0을 반환합니다.

+0

예, 알고 있습니다. 그러나 잠시 동안 합계를 살펴보십시오. 어떻게 그것이 .Sum()과 같은 결과를 나타내지 않는가? – Mickel