LINQ를 공부하다 보면 [ic]Orderby[/ic] 와 [ic]ThenBy[/ic]라는 용어를 자주 만나게 된다.
"둘다 정렬 하는 거 아닌가?" 하는 생각이 들 수도 있다. 그런데 이 둘 사이에는 미묘한 차이가 있다.🤔
예제 코드 준비
[ic]Team()[/ic] 객체를 담은 [ic]teams[/ic] 리스트를 준비한다.
List<Team> teams = new List<Team>()
{
new Team() { Name = "teamA", Score = 80, TimeCost = 50 },
new Team() { Name = "teamB", Score = 90, TimeCost = 40 },
new Team() { Name = "teamC", Score = 90, TimeCost = 60 },
new Team() { Name = "teamD", Score = 70, TimeCost = 30 },
new Team() { Name = "teamE", Score = 80, TimeCost = 40 }
};
class Team
{
public string Name { get; set; }
public int Score { get; set; }
public int TimeCost { get; set; }
}
Orderby 사용 예시
[ic]Orderby[/ic]를 이용하여 정렬을 한다.
[ic]team => team.Score[/ic]는 [ic]Score[/ic] 기준으로 정렬 하겠다는 거다.
(오름차순 정렬이 디폴트다.)
var result1 = teams.OrderBy(team => team.Score);
foreach (var team in result1)
{
Console.WriteLine($"{team.Name}: {team.Score}, {team.TimeCost}");
}
//output
teamD: 70, 30
teamA: 80, 50
teamE: 80, 40
teamB: 90, 40
teamC: 90, 60
내림차순 정렬을 하고 싶다면 [ic]Orderby[/ic]대신 [ic]OrderByDescending[/ic]를 이용하면 된다.
var result1 = teams.OrderByDescending(team => team.Score);
foreach (var team in result1)
{
Console.WriteLine($"{team.Name}: {team.Score}, {team.TimeCost}");
}
//output
teamB: 90, 40
teamC: 90, 60
teamA: 80, 50
teamE: 80, 40
teamD: 70, 30
ThenBy 사용 예시
[ic]Thenby[/ic]도 마찬가지로 정렬할 때 사용한다.
차이가 있다면 이전에 정렬된 결과를 기준으로 더 구체적인 정렬을 할 수 있다.
이게 무슨 말일까?
일단 정상적으로 사용한 케이스부터 보자.
var result1 = teams.OrderBy(team => team.Score).ThenBy(team => team.TimeCost);
foreach (var team in result1)
{
Console.WriteLine($"{team.Name}: {team.Score}, {team.TimeCost}");
}
//output
teamD: 70, 30
teamE: 80, 40
teamA: 80, 50
teamB: 90, 40
teamC: 90, 60
먼저 [ic]Score[/ic]를 기준으로 오름 차순 정렬 한다.
그 후 [ic]Thenby[/ic]를 통해 [ic]Timecost[/ic] 기준 오름 차순 정렬 한다.
이는 [ic]Score[/ic]를 기준으로 최우선 정렬하고 차선으로 [ic]TimeCost[/ic]를 정렬한것을 의미한다.
[ic]TimeCost[/ic] 중 오름 차순이 안된 값이 있는 건 이 때문이다.
그렇다면.
[ic]Orderby[/ic]를 두 번 쓰면 어떻게 될까?
var result1 = teams.OrderBy(team => team.Score).OrderBy(team => team.TimeCost);
foreach (var team in result1)
{
Console.WriteLine($"{team.Name}: {team.Score}, {team.TimeCost}");
}
//output
teamD: 70, 30
teamE: 80, 40
teamB: 90, 40
teamA: 80, 50
teamC: 90, 60
[ic]Orderby[/ic]를 두번 쓰게 되면 중첩 정렬은 불가하다.
왜냐하면 마지막에 사용한 정렬을 기준으로 모든게 재편되기 때문이다.
예를 들어, [ic]Score[/ic]를 기준으로 정렬하고, 그 다음 [ic]Name[/ic]을 기준으로 한번 더 정렬한다고 하면, 실제로는 [ic]Name[/ic]을 기준으로 모든 항목이 다시 정렬된다. 즉 이전에 [ic]Score[/ic]를 기준으로 한 정렬은 무의미해진다.
따라서 여러 기준으로 정렬할 때에는 [ic]ThenBy[/ic]를 사용해 기존에 정렬된 결과에 대해 추가적인 정렬 조건을 부여해야 한다.
이 글과 읽으면 좋은글
'c#' 카테고리의 다른 글
C# 필드(Field) vs. 프로퍼티(Property) 차이 비교 (3) | 2023.12.07 |
---|---|
[c# Linq] Select vs SelectMany 차이 (0) | 2023.03.20 |
[c# ] 필드 | 프러퍼티 앞에 붙어 있는 required는 뭘까? (0) | 2023.03.13 |
[c# EntityFramework] dbcontext 마이그레이션 롤백하는 방법 (0) | 2023.02.28 |
[c#] json 파싱하는법 (0) | 2023.02.23 |
댓글