C#
C#] System.Linq.Enumerable.Aggregate 함수
Fastlane
2023. 11. 15. 16:26
728x90
반응형
MS 문서를 기반으로 단계별로 살펴보자.
Aggregate() 함수는 source 순서로 모든 elements에 function을 적용하고, 매 함수 호출의 결과값으로 누적된 값을 계산한다.
3개의 오버로드를 갖는다.
1. Aggregate<TSource>(IEnumerable<TSource>, Func<TSource,TSource,TSource>)
public static TSource Aggregate<TSource> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TSource,TSource> func);
Code Example
string sentence = "the quick brown fox";
// 위 문자열을 개별 단어로 나눈다.
string[] words = sentence.Split(' ');
string reversed = words.Aggregate((workingSentence, next) =>
next + " " + workingSentence);
Console.WriteLine(reversed); // fox brown quick the
(workingSentence, next) => next + " " + workingSentence 의 lambda expression을 Aggregate() 함수에 전달한다. 이 expression은 3번(words 길이 - 1) 실행된다.
- 'the', 'quick'이 workingSentence와 next로 전달되고 'quick the'를 반환한다.
- 'quick the'와 'brown'이 workingSentence와 next로 전달되고 'brown quick the'를 반환한다.
- 'brown quick the'와 'fox'가 workingSentence와 next로 전달되고 ' fox brown quick the'를 반환한다.
2. Aggregate<TSource,TAccumulate>(IEnumerable<TSource>, TAccumulate, Func<TAccumulate,TSource,TAccumulate>)
public static TAccumulate Aggregate<TSource,TAccumulate> (this System.Collections.Generic.IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate,TSource,TAccumulate> func);
Code Example
int[] ints = { 4, 8, 8, 3, 9 };
// Count the even numbers in the array, using a seed value of 0.
int numEven = ints.Aggregate(0, (total, next) =>
next % 2 == 0 ? total + 1 : total);
Console.WriteLine("The number of even integers is: {0}", numEven);
// The number of even integers is: 3
2번째 오버로드는 seed를 초기값으로 받아서 func에 제공한다. seed의 data type과 func의 return value data type은 동일하다.
lambda expression은 5번(ints의 길이) 실행된다.
- 0, 4가 total와 next로 전달되고 1 을 반환한다.
- 1과 8이 total와 next로 전달되고 2 을 반환한다.
- 2와 8이 total와 next로 전달되고 3 을 반환한다.
- 3과 3이 total와 next로 전달되고 3 을 반환한다.
- 3과 9가 total와 next로 전달되고 3 을 반환한다.
3. Aggregate<TSource,TAccumulate,TResult>(IEnumerable<TSource>, TAccumulate, Func<TAccumulate,TSource,TAccumulate>, Func<TAccumulate,TResult>)
public static TResult Aggregate<TSource,TAccumulate,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate,TSource,TAccumulate> func, Func<TAccumulate,TResult> resultSelector);
Code Example
string[] fruits = { "apple", "passionfruit", "grape" };
// Determine whether any string in the array is longer than "banana".
string longestName =
fruits.Aggregate("banana",
(longest, next) =>
next.Length > longest.Length ? next : longest,
// Return the final result as an upper case string.
fruit => fruit.ToUpper());
Console.WriteLine(
"The fruit with the longest name is {0}.",
longestName);
// The fruit with the longest name is PASSIONFRUIT.
2번과 동일하게 진행되고 resultSelector에 의해 최종 누락된 값을 변환하여 반환한다.
func는 3번(fruits의 길이) 실행된다.
- "banana", "apple"이 longest와 next로 전달되고 "banana"를 반환한다.
- "banana", "passionfruit"이 longest와 next로 전달되고 "passionfruit "을 반환한다.
- "passionfruit", "grape"가 longest와 next로 전달되고 "passionfruit "을 반환한다.
- "passionfruit"을 대문자로 변환한다.
728x90
반응형