C#/LINQ

[C#]LINQ 합계 구하기 - Sum 메서드

DevStory 2022. 7. 28.

Sum 메서드

C#의 LINQ에서는 집계 함수를 제공합니다. 그중 Sum() 메서드는 컬렉션과 같은 데이터 집합에서 숫자 타입인 값의 합계를 계산하기 위해 사용됩니다.

 

이번 포스팅은 Linq에서 Sum() 메서드를 사용하는 다양한 예제를 소개합니다.


예제 1. int 타입의 List 합계

다음 예제는 Sum() 메서드를 사용하여 int 타입의 List에서 모든 요소의 합계를 계산합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>()
    {
      5, 10, 15, 20, 25
    };

    int sum = intList.Sum();

    Console.WriteLine("sum: " + sum);
  }
}

[실행 결과]

sum: 75

참고로 Sum() 메서드는 질의 구문에서 지원하지 않으므로 질의 구문에서 Sum() 메서드를 사용해야 하는 경우 메서드 구문과 혼합해서 사용해야 합니다.


예제 2. int 타입의 List에서 필터 후 합계

다음 예제는 int 타입의 List에서 20보다 작은 요소의 합계를 계산합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>()
    {
      5, 10, 15, 20, 25
    };

    // 1. 질의 구문(Query Syntax)
    int linqQueryResult = (from   num in intList
                           where  num < 20
                           select num).Sum();

    // 2. 메서드 구문(Method Syntax)
    int linqMethodResult = intList.Where(item => item < 20).Sum();

    Console.WriteLine("질의 구문 결과: " + linqQueryResult);
    Console.WriteLine("메서드 구문 결과: " + linqMethodResult);
  }
}

[실행 결과]

질의 구문 결과: 30
메서드 구문 결과: 30

예제 3. Func 대리자를 매개변수로 가지는 Sum() 메서드

int 타입의 값을 반환하는 Sum() 메서드는 네 가지 오버로드된 버전이 존재합니다.

// 첫 번째 버전
// Func 대리자를 매개변수로 가집니다.
// int 타입의 값을 반환합니다.
public static int Sum<TSource>(
  this IEnumerable<TSource> source, 
  Func<TSource, int> selector);

// 두 번째 버전
// Func 대리자를 매개변수로 가집니다.
// int 타입의 값을 반환하거나 null을 반환합니다.
public static int? Sum<TSource>(
  this IEnumerable<TSource> source, 
  Func<TSource, int?> selector);
  
// 세 번째 버전
// int 타입의 값을 반환합니다.
public static int Sum(this IEnumerable<int> source);

// 네 번째 버전
// int 타입의 값을 반환하거나 null을 반환합니다.
public static int? Sum(this IEnumerable<int?> source);

이번 예제는 Func 대리자를 매개변수로 가지는 Sum() 메서드 사용 방법을 보여줍니다.

 

Func 대리자에 대한 설명은 아래 포스팅에서 확인할 수 있습니다.

 

[C#]람다식, 람다표현식(Lambda expression)

람다식(Lambda expression)이란? 람다식(Lambda)식은 접근자, 함수 이름, return문이 없는 익명 함수(anonymous function)입니다. 람다식을 사용하면 더 짧은 코드를 작성할 수 있으며 코드를 더 가독성 있게 만

developer-talk.tistory.com

다음 예제는 Func 대리자를 매개변수로 가지는 Sum() 메서드를 사용하여 int 타입의 List에서 20보다 작은 요소의 합계를 계산합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>()
    {
      5, 10, 15, 20, 25
    };

    int sum = intList.Sum(item => {
      if (item < 20) return item;
      else return 0;
    });

    Console.WriteLine("sum: " + sum);
  }
}

[실행 결과]

sum: 30

예제 4. 사용자 정의 클래스

다음 예제는 사용자 정의 클래스인 Person 타입의 List에서 Money 프로퍼티의 합계를 계산합니다.

public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
  public int Money { get; set; }
}

class Program
{
  static void Main(string[] args)
  {
    List<Person> personA = new List<Person>
    {
      new Person{Name ="Bob",  Age = 20, Money = 30000},
      new Person{Name ="Nick", Age = 30, Money = 50000},
      new Person{Name ="Tom",  Age = 40, Money = 80000}
    };

    // 1. 질의 구문(Query Syntax)
    int linqQueryResult = (from   person in personA
                           select person).Sum(item => item.Money);

    // 2. 메서드 구문(Method Syntax)
    int linqMethodResult = personA.Sum(item => item.Money);

    Console.WriteLine("질의 구문 결과: " + linqQueryResult);
    Console.WriteLine("메서드 구문 결과: " + linqMethodResult);
  }
}

[실행 결과]

질의 구문 결과: 160000
메서드 구문 결과: 160000

예제 5. 사용자 정의 클래스와 Func 대리자 사용

다음 예제는 Func 대리자를 매개변수로 가지는 Sum() 메서드를 사용하여 Age 프로퍼티가 20보다 큰 사람의 Money 프로퍼티 합계를 계산합니다.

public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
  public int Money { get; set; }
}

class Program
{
  static void Main(string[] args)
  {
    List<Person> personA = new List<Person>
    {
      new Person{Name ="Bob",  Age = 20, Money = 30000},
      new Person{Name ="Nick", Age = 30, Money = 50000},
      new Person{Name ="Tom",  Age = 40, Money = 80000}
    };
    
    int sum = personA.Sum(item => {
      if (item.Age > 20) return item.Money;
      else return 0;
    });
    
    Console.WriteLine("sum: " + sum);
  }
}

[실행 결과]

sum: 130000
반응형

댓글