LINQ를 공부하다 보면 Orderby
와 ThenBy
라는 용어를 자주 만나게 된다.
"둘다 정렬 하는 거 아닌가?" 하는 생각이 들 수도 있다. 그런데 이 둘 사이에는 미묘한 차이가 있다.🤔
예제 코드 준비
Team()
객체를 담은 teams
리스트를 준비한다.
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 사용 예시
Orderby
를 이용하여 정렬을 한다.
team => team.Score
는 Score
기준으로 정렬 하겠다는 거다.
(오름차순 정렬이 디폴트다.)
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
내림차순 정렬을 하고 싶다면 Orderby
대신 OrderByDescending
를 이용하면 된다.
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 사용 예시
Thenby
도 마찬가지로 정렬할 때 사용한다.
차이가 있다면 이전에 정렬된 결과를 기준으로 더 구체적인 정렬을 할 수 있다.
이게 무슨 말일까?
일단 정상적으로 사용한 케이스부터 보자.
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
먼저 Score
를 기준으로 오름 차순 정렬 한다.
그 후 Thenby
를 통해 Timecost
기준 오름 차순 정렬 한다.
이는 Score
를 기준으로 최우선 정렬하고 차선으로 TimeCost
를 정렬한것을 의미한다.
TimeCost
중 오름 차순이 안된 값이 있는 건 이 때문이다.
그렇다면.
Orderby
를 두 번 쓰면 어떻게 될까?
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
Orderby
를 두번 쓰게 되면 중첩 정렬은 불가하다.
왜냐하면 마지막에 사용한 정렬을 기준으로 모든게 재편되기 때문이다.
예를 들어, Score
를 기준으로 정렬하고, 그 다음 Name
을 기준으로 한번 더 정렬한다고 하면, 실제로는 Name
을 기준으로 모든 항목이 다시 정렬된다. 즉 이전에 Score
를 기준으로 한 정렬은 무의미해진다.
따라서 여러 기준으로 정렬할 때에는 ThenBy
를 사용해 기존에 정렬된 결과에 대해 추가적인 정렬 조건을 부여해야 한다.
이 글과 읽으면 좋은글
'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 |
댓글
꼬예님의
글이 좋았다면 응원을 보내주세요!
이 글이 도움이 됐다면, 응원 댓글을 써보세요. 블로거에게 지급되는 응원금은 새로운 창작의 큰 힘이 됩니다.
응원 댓글은 만 14세 이상 카카오계정 이용자라면 누구나 편하게 작성, 결제할 수 있습니다.
글 본문, 댓글 목록 등을 통해 응원한 팬과 응원 댓글, 응원금을 강조해 보여줍니다.
응원금은 앱에서는 인앱결제, 웹에서는 카카오페이 및 신용카드로 결제할 수 있습니다.