2009-08-05 2 views
69

MSDN's Linq samples에서 사용하고 싶은 Fold()라고하는 깔끔한 방법을 발견했습니다. 그들의 예 : 불행하게도"Fold"LINQ 확장 방법은 어디에 있습니까?

double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 }; 
double product = 
    doubles.Fold((runningProduct, nextFactor) => runningProduct * nextFactor); 

, 나는 그들의 예 또는 내 자신의 코드에 하나,이 컴파일 얻을 수 없다, 나는 (Enumerable에서 또는 배열 확장 방법 등) MSDN에 다른 곳에서는 찾을 수없는 이 방법을 언급하십시오. 내가 오류 오류 "그것에 대해 아무것도 모른다"일반 오래된 :

error CS1061: 'System.Array' does not contain a definition for 'Fold' and no 
extension method 'Fold' accepting a first argument of type 'System.Array' could 
be found (are you missing a using directive or an assembly reference?) 

내가 Linq에에서 온 믿고 다른 방법을 사용하고, 그리고 (선택()과 경우() 등) 저는 "System.Linq"를 사용하고 있습니다. 그래서 괜찮습니다.

이 방법이 C# 3.5에 실제로 존재합니까? 그렇다면 무엇이 잘못 되었습니까?

+3

참조한 샘플 페이지에서 빵 부스러기 흔적 *을 확인하십시오. 이는 C# 3을 미래 제품으로 참조합니다. 미래의 제품은 출시되기 전에 종종 변경됩니다. 언급 된 다른 사람들과 마찬가지로, Enumerable.Aggregate 및 재미를 참조하십시오. :) * Visual C# 개발자 센터> 홈> 제품 정보> 향후 버전> 101 LINQ 샘플> 집계 연산자 –

답변

94

당신은 Aggregate 확장 방법을 사용하는 것이 좋습니다 :

double product = doubles.Aggregate(1.0, (prod, next) => prod * next); 

자세한 내용은 MSDN를 참조하십시오. seed을 지정하고 연속적인 값을 계산하는 표현식을 지정할 수 있습니다.

+2

씨앗도 필요 없다는 점에 유의해야합니다. 시드가없는 오버로드를 호출하면 목록의 첫 번째 요소가 초기 집계 값으로 사용되고 'Func'은 두 번째 요소에 도달하면 호출됩니다. 참조 : https://msdn.microsoft.com/en-us/library/vstudio/bb548651(v=vs.110).aspx –

+0

오른쪽으로 이해하면 폴드되지 않습니다./폴드는 두 인수를 모두 받아 들여야합니다. 다른 유형. 예 :첫 번째 인자는 문자열을 사용하고 두 번째 인자는'ToString()'을 사용하여 전체 컨테이너의 텍스트 표현을 반환 할 수 있습니다. –

+0

@ Hi-Angel, 아니요,이 예제는 실제로 폴드입니다. ' '타입 파라미터는 컴파일러에 의해 자동으로 추론되므로 필요하지 않습니다. – kdbanman

36

Fold (일명 Reduce)은 함수형 프로그래밍의 표준 용어입니다. 어떤 이유로 든 LINQ에 Aggregate이라는 이름이 지정되었습니다.

double product = doubles.Aggregate(1.0, (runningProduct, nextFactor) => runningProduct* nextFactor); 
+8

집계는 OO 및 SQL 영역에서 더 익숙한 용어입니다. –

+2

CREATE AGGREGATE 키워드를 인식하지 못했습니다 (http://msdn.microsoft.com/en-us/library/ms182741.aspx) 매일 새로운 것을 배웁니다. –

+4

웃겨, 나는 "SQL"밖에서 "집계"를 들어 본 적이 없다. WP에는 몇 가지 언어 중 http://en.wikipedia.org/wiki/Fold_(higher-order_function) 목록이 있으며 "#"을 "집계 (Aggregate)"라고 부르는 유일한 언어입니다. "Reduce"는 ML 패밀리의 경우 "Fold", Smalltalk 및 친구들의 경우 "Inject"로 이어지는 분명한 승자입니다. – Ken

관련 문제