무효 클릭 IP 추적 중...
c#

[c# LINQ] Orderby vs ThenBy 차이

꼬예 2023. 3. 20.

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]를 사용해 기존에 정렬된 결과에 대해 추가적인 정렬 조건을 부여해야 한다.

 

이 글과 읽으면 좋은글

 

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글