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

[c# LINQ] Orderby vs ThenBy 차이

꼬예 2023. 3. 20.
[c# LINQ] Orderby vs ThenBy 차이

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

 

이 글과 읽으면 좋은글

 

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

댓글

꼬예님의
글이 좋았다면 응원을 보내주세요!