"접기"LINQ 확장 방법은 어디에 있습니까?


95

MSDN의 Linq 샘플 에서 사용하려는 Fold ()라는 깔끔한 메서드를 발견했습니다 . 그들의 예 :

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

불행히도 예제 나 내 코드에서 컴파일 할 수 없으며 MSDN에서이 메서드를 언급하는 다른 곳 (예 : Enumerable 또는 Array 확장 메서드)을 찾을 수 없습니다. 내가 얻는 오류는 "그에 대해 아무것도 모른다"라는 평범한 오래된 오류입니다.

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 (Select () 및 Where ()와 같은)에서 온 것으로 생각되는 다른 방법을 사용하고 있으며 "System.Linq를 사용"하고 있으므로 괜찮다고 생각합니다.

이 방법은 실제로 C # 3.5에 존재합니까? 그렇다면 내가 뭘 잘못하고 있습니까?


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

답변:


126

Aggregate확장 방법 을 사용하는 것이 좋습니다 .

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

자세한 내용은 MSDN 을 참조하십시오. a를 지정한 seed다음 식을 지정하여 연속 값을 계산할 수 있습니다.


4
또한 씨앗이 없어도된다는 점에 유의해야합니다. 시드가없는 오버로드를 호출하면 목록의 첫 번째 요소가 초기 집계 값으로 사용되며 Func두 번째 요소에 도달 한 후에 만 ​​호출됩니다. 참조 : msdn.microsoft.com/en-us/library/vstudio/…
Josh Gallagher

내가 옳다고 이해한다면 접히지 않습니다. : / 접기는 다른 유형의 두 인수를 모두 받아 들여야합니다. 예를 들어 첫 번째 인수로 문자열을 사용하고 두 번째 인수로 ToString()를 사용하여 전체 컨테이너의 텍스트 표현을 반환 할 수 있습니다.
Hi-Angel

@ Hi-Angel, 아니요, 예는 실제로 접습니다. <double>유형 매개 변수는 자동으로 따라서 필요하지 컴파일러에 의해 추정된다.
kdbanman 2015

1
하이 천사 @ pelem같은 당신을 입력 무엇이든 할 수있다. 이 예 에서 사용 된 이 과부하 를 참조하십시오
kdbanman 2015

1
@kdbanman errr, ⁺¹, 그 당시에 저에게 효과가 없었던 이유가 정말 흥미 롭습니다 ... : / 맞아요, 효과가 있습니다.
Hi-Angel

42

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

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

9
집계는 OO 및 SQL 영역에서 더 친숙한 용어입니다.
Adam Robinson

3
CREATE AGGREGATE 키워드 ( msdn.microsoft.com/en-us/library/ms182741.aspx )를 몰랐 습니다. 매일 새로운 것을 배우십시오.
Richard Berg

5
재미있게도, SQL 외부에서 "집계"를 들어 본 적이 없습니다. WP에는 수십 개 언어의 en.wikipedia.org/wiki/Fold_(higher-order_function) 목록이 있으며 C #은이를 "집계"라고 부르는 유일한 언어입니다. "Reduce"가 확실한 승자이며 ML 제품군의 경우 "Fold", Smalltalk 및 친구들의 경우 "Inject"가 그 뒤를이었습니다.

12
이름은 기능의 문제입니다. 구현 방법은 관련이 없습니다. 그리고 FWIW, 왼쪽 폴드는 가능한 경우 반복적으로 구현됩니다 ... 일반적으로 꼬리 재귀를 통해 기능 언어로 구현됩니다. 그리고 C #에는 오른쪽 접힘이 없습니다. 이는 부분적으로 "지도"에 대해 "선택"만큼 나쁘지는 않지만 어리석은 이름을 선택하고 기존 기능 기술을 무시한 결과입니다. Aggregate가 OO 영역에서 더 친숙한 용어에 관해서는 ... 아니, 전혀 아닙니다.
Jim Balter 2013-08-23

9
공정하게 말하면 Microsoft가 기존 기능 기술이나 용어를 무시하는 것이 아니라 많은 엔터프라이즈 프로그래머가 기능 프로그래밍 용어보다 더 익숙한 데이터베이스 액세스 및 SQL 용어에 대한 방향이라고 생각합니다.
RavuAlHemio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.