LINQ의 Enumerable.Aggregate 메서드 이해
Aggregate
메서드는 IEnumerable
에서 상속받은 컬렉션의 확장 메서드입니다.몇 주 전에는 조건에 따라 계좌가 시스템에 추가된 첫날부터 특정 연도, 월, 주에 계좌 목록에서 인출될 예상 총액을 표시해야 했습니다.
이는 다음과 같은 이유로 계정에서 인출될 모든 금액의 합계와 다릅니다.
이 경우 선호되는 방법은
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
함수가 IEnumerable
의 extension method임을 보여줍니다. source
는 집계하려는 컬렉션입니다. Func<TSource, TSource, TSource>
는 마지막 TSource
를 반환하는 delegate입니다. 다른 오버로드도 마찬가지입니다. 컬렉션의 각 요소에서 호출할 누산기 작업을 나타냅니다.
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을 참조하십시오.
즐거운 코딩하세요. 🚀
Reference
이 문제에 관하여(LINQ의 Enumerable.Aggregate 메서드 이해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ayodejii/understanding-the-enumerableaggregate-method-in-linq-5dpl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)