Min, Max 메서드
C#의 LINQ에서는 집계 함수를 제공합니다. 그중 Min() 메서드는 컬렉션과 같은 데이터 집합에서 최솟값을 구하기 위해 사용되며, Max() 메서드는 최댓값을 구하기 위해 사용됩니다.
메서드 오버로드
System.Linq의 Enumerable 클래스를 살펴보면 Min() 메서드와 Max() 메서드는 오버로드된 다양한 버전의 메서드가 존재한다는 것을 확인할 수 있습니다.
반환 타입은 숫자 타입이 아닐 수 있으며, Func 대리자를 매개변수로 가질 수 있습니다. 오버로드된 Min() 메서드와 Max() 메서드의 개수는 동일합니다.
Func 대리자에 대한 내용은 아래 포스팅에서 확인할 수 있습니다.
예제 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
'C# > LINQ' 카테고리의 다른 글
[C#]LINQ 데이터 개수 구하기 - Count 메서드 (0) | 2022.07.31 |
---|---|
[C#]LINQ 평균 구하기 - Average 메서드 (0) | 2022.07.31 |
[C#]LINQ 합계 구하기 - Sum 메서드 (0) | 2022.07.28 |
[C#]LINQ 특정 조건을 만족하는지 체크하는 방법 - All, Any 메서드 (1) | 2022.07.24 |
[C#]LINQ 특정 값 포함 여부 - Contains 메서드 (0) | 2022.07.18 |
댓글