C#/LINQ

[C#]LINQ 최소값, 최대값 구하기 - Min, Max 메서드

DevStory 2022. 7. 31.

Min, Max 메서드

C#의 LINQ에서는 집계 함수를 제공합니다. 그중 Min() 메서드는 컬렉션과 같은 데이터 집합에서 최솟값을 구하기 위해 사용되며, Max() 메서드는 최댓값을 구하기 위해 사용됩니다.


메서드 오버로드

System.Linq의 Enumerable 클래스를 살펴보면 Min() 메서드와 Max() 메서드는 오버로드된 다양한 버전의 메서드가 존재한다는 것을 확인할 수 있습니다.

반환 타입은 숫자 타입이 아닐 수 있으며, Func 대리자를 매개변수로 가질 수 있습니다. 오버로드된 Min() 메서드와 Max() 메서드의 개수는 동일합니다.

 

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

 

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

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

developer-talk.tistory.com


예제 1. int 타입의 List

다음 예제는 int 타입의 List에서 제일 작은 수와 제일 큰 수를 반환합니다.

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

    int minValue = intList.Min();
    int maxValue = intList.Max();

    Console.WriteLine("minValue: " + minValue);
    Console.WriteLine("maxValue: " + maxValue);
  }
}

[실행 결과]

minValue: 5
maxValue: 25

참고로 Min() 메서드와 Max() 메서드는 질의 구문에서 지원하지 않으므로 질의 구문에서 최솟값 또는 최댓값을 구해야 하는 경우 메서드 구문과 혼합해서 사용해야 합니다.


예제 2. string 타입의 List

다음 예제는 string 타입의 List에서 최솟값과 최댓값을 반환합니다. 문자열은 ASCII 값을 비교하여 가장 낮은 값이 최솟값이며, 가장 큰 값이 최댓값입니다.

class Program
{
  static void Main(string[] args)
  {
    List<string> strList = new List<string>()
    {
       "BBC", "ABC", "C", "CD", "CDE", "B"
    };

    string minValue = strList.Min();
    string maxValue = strList.Max();

    Console.WriteLine("minValue: " + minValue);
    Console.WriteLine("maxValue: " + maxValue);
  }
}

[실행 결과]

minValue: ABC
maxValue: CDE

예제 3. Where절을 사용하는 int 타입의 List

다음 예제는 int 타입의 List에서 20보다 크고 40보다 작은 요소의 최솟값과 최댓값을 반환합니다.

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

    // 1. 질의 구문(Query Syntax)
    int linqQueryResultMin = (from   num in intList
                              where  num > 20 && num < 40
                              select num).Min();

    int linqQueryResultMax = (from   num in intList
                              where  num > 20 && num < 40
                              select num).Max();

    // 2. 메서드 구문(Method Syntax)
    int linqMethodResultMin = intList.Where(item => item > 20 && item < 40).Min();
    int linqMethodResultMax = intList.Where(item => item > 20 && item < 40).Max();

    Console.WriteLine("질의 구문");
    Console.WriteLine("질의 구문 Min: " + linqQueryResultMin);
    Console.WriteLine("질의 구문 Max: " + linqQueryResultMax);

    Console.WriteLine("\n메서드 구문");
    Console.WriteLine("메서드 구문 Min: " + linqMethodResultMin);
    Console.WriteLine("메서드 구문 Max: " + linqMethodResultMax);
  }
}

[실행 결과]

질의 구문
질의 구문 Min: 25
질의 구문 Max: 35

메서드 구문
메서드 구문 Min: 25
메서드 구문 Max: 35

참고로 필터된 데이터가 없는데, Min() 메서드와 Max() 메서드를 사용하는 경우 런타임 에러가 발생합니다.

 

다음 예제는 where절에서 50보다 큰 요소를 필터링 후 Min() 메서드와 Max() 메서드를 호출합니다.

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

    // 1. 질의 구문(Query Syntax)
    int linqQueryResultMin = (from   num in intList
                              where   num > 50
                              select num).Min();

    int linqQueryResultMax = (from   num in intList
                              where   num > 50
                              select num).Max();

    // 2. 메서드 구문(Method Syntax)
    int linqMethodResultMin = intList.Where(item => item > 50).Min();
    int linqMethodResultMax = intList.Where(item => item > 50).Max();

    Console.WriteLine("질의 구문");
    Console.WriteLine("질의 구문 Min: " + linqQueryResultMin);
    Console.WriteLine("질의 구문 Max: " + linqQueryResultMax);

    Console.WriteLine("\n메서드 구문");
    Console.WriteLine("메서드 구문 Min: " + linqMethodResultMin);
    Console.WriteLine("메서드 구문 Max: " + linqMethodResultMax);
  }
}

[에러 내용]


예제 4. Func 대리자를 매개변수로 사용

Func 대리자를 매개변수로 사용하면, Where절을 사용하지 않고 Min(), Max() 메서드에서 데이터를 필터링할 수 있습니다.

 

다음 예제는 int 타입의 List에서 20보다 큰 요소의 최솟값을 구합니다.

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

    // 1. 질의 구문(Query Syntax)
    int linqQueryResultMin = (from   num in intList
                              where  num > 20
                              select num).Min(item => {
                                  if (item > 20) return item;
                                  else return 0;
                              });

    // 2. 메서드 구문(Method Syntax)
    int linqMethodResultMin = intList
        .Where(item => item > 20)
        .Min(item => {
            if (item > 20) return item;
            else return 0;
        });

    Console.WriteLine("질의 구문");
    Console.WriteLine("질의 구문 Min: " + linqQueryResultMin);

    Console.WriteLine("\n메서드 구문");
    Console.WriteLine("메서드 구문 Min: " + linqMethodResultMin);
  }
}

[실행 결과]

질의 구문
질의 구문 Min: 25

메서드 구문
메서드 구문 Min: 25

 

다음 예제는 int 타입의 List에서 30보다 작은 요소의 최댓값을 구합니다.

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

    // 1. 질의 구문(Query Syntax)
    int linqQueryResultMax = (from   num in intList
                              select num).Max(item => {
                                  if (item < 30) return item;
                                  else return 0;
                              });


    // 2. 메서드 구문(Method Syntax)
    int linqMethodResultMax = intList.Max(item => {
        if (item < 30) return item;
        else return 0;
    });

    Console.WriteLine("질의 구문");
    Console.WriteLine("질의 구문 Max: " + linqQueryResultMax);

    Console.WriteLine("\n메서드 구문");
    Console.WriteLine("메서드 구문 Max: " + linqMethodResultMax);
  }
}

[실행 결과]

질의 구문
질의 구문 Max: 25

메서드 구문
메서드 구문 Max: 25

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

다음 예제는 사용자 정의 클래스인 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 linqQueryResultMin = (from   person in personA
                              select person).Min(item => item.Money);

    int linqQueryResultMax = (from   person in personA
                              select person).Max(item => item.Money);

    // 2. 메서드 구문(Method Syntax)
    int linqMethodResultMin = personA.Min(item => item.Money);
    int linqMethodResultMax = personA.Max(item => item.Money);

    Console.WriteLine("질의 구문");
    Console.WriteLine("질의 구문 Min: " + linqQueryResultMin);
    Console.WriteLine("질의 구문 Max: " + linqQueryResultMax);

    Console.WriteLine("\n메서드 구문");
    Console.WriteLine("메서드 구문 Min: " + linqMethodResultMin);
    Console.WriteLine("메서드 구문 Max: " + linqMethodResultMax);
  }
}

[실행 결과]

질의 구문
질의 구문 Min: 30000
질의 구문 Max: 80000

메서드 구문
메서드 구문 Min: 30000
메서드 구문 Max: 80000
반응형

댓글