LINQ의 Enumerable.Aggregate 메서드 이해

TL/DR
  • Aggregate 메서드는 IEnumerable에서 상속받은 컬렉션의 확장 메서드입니다.
  • 메서드가 모든 유형의 값을 하나만 반환합니다
  • .
  • 합계, 개수 등과 같은 가산 기능입니다.
  • 과부하가 3개 있음

  • 몇 주 전에는 조건에 따라 계좌가 시스템에 추가된 첫날부터 특정 연도, 월, 주에 계좌 목록에서 인출될 예상 총액을 표시해야 했습니다.

    이는 다음과 같은 이유로 계정에서 인출될 모든 금액의 합계와 다릅니다.
  • 계정 목록의 각 반복에서 따라야 할 조건이 있습니다
  • .
  • 내 반환 값은 튜플, 즉 주, 월, 연 공제를 나타내는 세 개의 int 값으로 구성된 튜플입니다
  • .

    이 경우 선호되는 방법은 Aggregate 방법입니다. IEnumerable 에서 상속되는 모든 C# 컬렉션에 있습니다.
    Aggregate 메서드는 이전 작업을 고려하여 목록의 각 요소에 대한 작업을 수행합니다. 예를 들어 목록의 처음 두 요소에 대해 작업을 수행하고 그 결과를 사용하여 세 번째 요소에 대해 작업하고 계속해서 단일 값을 반환합니다.

    이걸 고려하세요:

    int[] numbers = { 1, 2, 3, 4, 5};
    
    //we use aggregate to get the summation of the elements of the list
    
    int summation = numbers.Aggregate((a, b) => a + b);
    
    //summation will be 1 + 2 + 3 + 4 + 5 = 15
    


    누적 기능
    Aggregate 방법은 누적 함수입니다. 누적 함수는 컬렉션의 행을 결합하고 각 행에 대해 작업을 수행하고 단일 값을 반환합니다. LINQ에는 Sum, Max, Min, Count 및 Average와 같은 다양한 누적 함수가 있지만 Aggregate 메서드는 이러한 메서드가 수행하는 모든 작업 등을 수행할 수 있습니다.
    Aggregate의 또 다른 장점은 숫자 데이터 유형에서만 작동하는 다른 컬렉션과 달리 모든 유형의 컬렉션에서 작업을 수행한다는 것입니다.

    이걸 고려하세요:

    
    //flatten a list of countries to a string separated by comma
    
    string[] countries = {"Nigeria", "Ghana", "Togo"};
    
    string countriesToString = countries.Aggregate((a, b) => a + ", " + 
      b);
    
    //countriesToString will be "Nigeria, Ghana, Togo"
    


    집계 방법의 과부하
    Aggregate 메서드에는 세 가지 오버로드가 있으며 첫 번째 오버로드는 위에서 설명하고 사용합니다.
    그러나 여기에 첫 번째 오버로드의 서명을 추가하고 C# 용어로 설명하겠습니다.
    세 가지 과부하는 다음과 같습니다.

    1. public static TSource Aggregate<TSource>(this IEnumerable<TSource> source,  
    Func<TSource, TSource, TSource> func);
    
    2. public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source,  
    TAccumulate seed,  
    Func<TAccumulate, TSource, TAccumulate> func);
    
    3. public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source,  
    TAccumulate seed,  
    Func<TAccumulate, TSource, TAccumulate> func,  
    Func<TAccumulate, TResult> resultSelector);
    


  • 집계 방법은 일반적입니다. 즉, 모든 유형을 취하고 반환하므로 Aggregate<TSource> 및 기타 유형을 반환합니다.
  • TSource는 집계하려는 Enumerable의 요소 유형입니다. 여기서 this 키워드는 Aggregate 함수가 IEnumerableextension method임을 보여줍니다.
  • source는 집계하려는 컬렉션입니다.
  • Func<TSource, TSource, TSource>는 마지막 TSource를 반환하는 delegate입니다.

  • 다른 오버로드도 마찬가지입니다. 컬렉션의 각 요소에서 호출할 누산기 작업을 나타냅니다.
  • 두 번째 및 세 번째 오버로드에는 seed라는 매개변수가 있습니다. 즉, TAccumulate seed 입니다.

  • 이것은 초기 누산기 값을 나타냅니다. 모든 유형이 될 수 있으며 "이 값으로 시작"이라고 말합니다.

    이 시드의 값은 Aggregate의 반환 값을 결정합니다.

    위의 숫자 예를 사용하겠습니다.
    다른 요소를 추가하기 전에 합계에 10을 더하고 싶다고 가정해 보겠습니다.

    int[] numbers = {1, 2, 3, 4, 5};
    
    //we use the seed parameter:
    
    int summation = numbers.Aggregate(10, (a, b) => a + b);
    
    //summation will be 10 + 1 + 2 + 3 + 4 + 5 = 25
    


    마지막 오버로드에는 최종 값을 원하는 결과 값으로 변환하는 함수인 추가 대리자Func<TAccumulate, TResult> resultSelector가 있습니다.

    즉, Aggregate 값은 하나의 값만 반환하므로 얻은 결과에 대해 다른 작업을 수행할지 결정할 수 있습니다.

    위의 국가 예를 통해 이것을 연습해 봅시다.

    
    //flatten a list of countries to a string separated by comma
    //add another west African country to the start of the list
    //then convert these countries to upper case
    
    string[] countries = {"Nigeria", "Ghana", "Togo"};
    
    string countriesToUpper = countries.Aggregate("Liberia", (a, b) => a + ", " + 
      b, countryString => countryString.ToUpper());
    
    //countriesToUpper will be "LIBERIA, NIGERIA, GHANA, TOGO"
    


    NB: 위의 코드를 작성하는 더 좋은 방법이 있습니다. 이 오버로드를 사용하지 않고 국가를 대문자로 변환할 수 있습니다.

    람다를 사용하는 대신 코드 블록 외부에서 메소드를 정의하고 Aggregator 메소드 내부에서 사용할 수 있습니다.

    int[] numbers = {1, 2, 3, 4, 5};
    
    //we use the seed parameter:
    
    int result =  numbers.Aggregate(0, (a, b) =>
    {
        return doMathsOnNumbers(a, b);
    });
    
    int doMathsOnNumbers(int first, int second)
    {
        if (first > second)
            return first - second;
        return first + second;
    };
    //result will be 7
    


    이 방법은 재미있고 시도해 봐야 합니다. 언젠가는 확실히 도움이 될 것입니다.
    이 방법에 대한 자세한 내용은 Microsoft docs을 참조하십시오.

    즐거운 코딩하세요. 🚀

    좋은 웹페이지 즐겨찾기