본문 바로가기
프로그래밍/C# LINQ

C# Linq - Enumerable.Aggregate()

by bantomak 2023. 6. 26.

Aggregate()

합계, 총액이라는 의미로 생각하면 이해하기가 편하다. 누적 연산을 할 때 쓰면 유용하다.

정리하자면, 리스트의 요소들을 하나의 값으로 변환한다.

 

함수형 프로그래밍에는 Fold(), Reduce()와 같은 함수들이 비슷한 기능을 한다.

 

문자열 모아서 출력하기

각각의 요소들을 이어 붙여서 하나의 문자열로 출력이 가능하다.

 

public class Program
{
    static void Main(string[] args)
    {
        string[] list = {"kim", "lee", "park", "choi", "dol"};
        var data = list.Aggregate((str1, str2) => str1 + ", " + str2);

        Console.WriteLine(data);
    }
}

 

answer1

숫자 합산하기

각각의 요소들을 모아서 합계로 출력이 가능하다.

Sum 함수를 사용할 수도 있지만 Aggregate를 통해서도 구현이 가능하다.

 

public class Program
{
    static void Main(string[] args)
    {
        List<int> list = new List<int>() { 1,2,3,4,5,6,7,8,9,10 };

        var data = list.Aggregate((value1, value2) => value1 + value2);

        Console.WriteLine(data);
    }
}

 

answer2

 

using System;
using System.Collections.Generic;
using System.Linq;

public partial class Program
{
    static void Main(string[] args)
    {
        AggregateInt();
    }

    public static void AggregateInt()
    {
        var list = new List<int>() { 1, 2, 3, 4, 5, 6 };

        int addision = list.Aggregate((sum, i) => sum + i);

        Console.WriteLine($"The sum of listInt is {addision}");
    }
}

 

1부터 6까지 정수를 포함하는 int 형식의 리스트를 만들고, Aggregate를 이용해서 이 리스트(listInt) 내의 항목들의 합을 구한다. 다음은 이 코드의 흐름이다.

(sum, i) => sum + i
sum = 1
sum = 1 + 2
sum = 3 + 3
sum = 6 + 4
sum = 10 + 5
sum = 15 + 6
sum = 21
addition = sum

 

 

조건별로 모으기

조건에 맞는 대상만 모아서 출력하는 게 가능하다.

 

public class Program
{
    static void Main(string[] args)
    {
        string[] fruits = { "apple", "mango", "orange", "passionfruit", "grape" };

        string longestName = fruits.Aggregate((longest, next) => next.Length > longest.Length ? next : longest);

        Console.WriteLine("The fruit with the longest name is {0}.", longestName);
    }
}

 

answer3

 

가장 작은 값 찾기

삼항 연산자를 이용해서 가장 작은 수를 찾는 것도 가능하다.

 

public class Program
{
    static void Main(string[] args)
    {
        List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        var min = list.Aggregate((value1, value2) => (value1 < value2) ? value1 : value2 );

        Console.WriteLine(min);
    }
}

 

두 원소 사이의 차이가 가장 적은 항목을 찾기

static void Main(string[] args)
{
    List<(int, int)> list = new List<(int, int)>() { (1, 2), (3, 5), (10, 20) };

    var result = list.Aggregate(CompareAnB);
    Console.WriteLine($"{result.Item1} {result.Item2}");
}

static (int, int) CompareAnB((int, int) a, (int, int) b)
{
    return (a.Item1 - a.Item2) > (b.Item1 - b.Item2) ? a : b;
}

 

참조 사이트

 

Enumerable.Aggregate 메서드 (System.Linq)

시퀀스에 누적기 함수를 적용합니다. 지정된 시드 값은 초기 누적기 값으로 사용되고 지정된 함수는 결과 값을 선택하는 데 사용됩니다.

learn.microsoft.com

함께 읽으면 좋은 글

 

C# String.Join에 대해서

문자열 관련 코드를 보다 보면 가끔 보이는 String.Join() 메서드 하지만 가끔 보다 보니 매번 헷갈려서 인터넷에서 검색하게 된다. 이번에는 확실히 정리하고 기억해 보자. 함수 원형 public static stri

jettstream.tistory.com

 

[프로그래머스 Programmers] 길이에 따른 연산

문제 설명 정수가 담긴 리스트 num_list가 주어질 때, 리스트의 길이가 11 이상이면 리스트에 있는 모든 원소의 합을 10 이하이면 모든 원소의 곱을 return하도록 solution 함수를 완성해주세요. 제한 사

jettstream.tistory.com

'프로그래밍 > C# LINQ' 카테고리의 다른 글

C# Linq - Enumerable.All()  (0) 2024.02.15
C# Linq - Enumerable.Range()  (0) 2023.12.18
C# Linq - Enumerable.OrderBy()  (26) 2023.06.20
C# Select vs SelectMany  (22) 2023.06.19
C# Linq - Enumerable.Repeat()  (26) 2023.06.13

댓글