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
반응형