C#에서 키로 사전 정렬

Syed Hassan Sabeeh Kazmi 2023년10월12일
  1. OrderBy() LINQ 메서드를 사용하여 C#의 키를 기준으로 사전 정렬
  2. SortedList<TKey, TValue> 클래스를 사용하여 C#의 키를 기준으로 사전 정렬
  3. SortedDictionary<TKey, TValue> 클래스를 사용하여 C#의 키를 기준으로 사전 정렬
C#에서 키로 사전 정렬

C#에서 사전은 해시 테이블로의 구현을 반영하는 거의 일정한 시간 조회를 허용합니다. 즉, 본질적으로 정렬되지 않음을 의미합니다. 사전에는 미리 정의된 정렬 방법이 없으므로 사전의 요소를 별도로 획득하여 정렬할 수 있습니다.

첫 번째 방법은 OrderBy() LINQ 방법을 사용하는 것입니다. 그러나 모든 항목을 정렬해야 하므로 O(n*log(n)) 성능이 가장 좋지 않습니다. 키로 사전 요소에 반복적으로 액세스해야 하는 경우 SortedList 또는 SortedDictionary를 사용하면 품질을 손상시키지 않고 이 목적을 달성하는 데 도움이 될 수 있습니다.

선형 시간 O(n)에서 순서대로 요소 목록을 추출할 때 조회 및 삽입 시간에서 일부 성능이 손실될 수 있습니다. 이 자습서에서는 C#에서 키를 기준으로 사전을 정렬하는 세 가지 가능한 방법을 배웁니다.

OrderBy() LINQ 메서드를 사용하여 C#의 키를 기준으로 사전 정렬

이 LINQ 메서드를 사용하면 프로그래머가 사전에서 KeyValuePartsIOrderedEnumerable을 추출하여 키별로 정렬할 수 있습니다. 사전은 요소를 순서대로 저장할 수 없기 때문에 사전의 정렬은 O(n*log(n))가 됩니다.

LINQ 메서드는 System.Linq 네임스페이스에 속하며 정렬된 사전의 각 키에 대한 모든 키-값 쌍을 쉽게 처리할 수 있습니다. OrderBy 메서드는 지연 실행으로 구현되며 사전 정렬에 필요한 모든 정보를 저장하는 개체를 즉시 반환합니다.

안정적인 정렬을 수행하며 두 요소의 키가 같으면 요소의 순서가 유지됩니다.

예제 코드:

using System;
using System.Linq;
using System.Collections.Generic;

public class sortOrderBy {
  public static void Main(string[] args) {
    var metal = new Dictionary<string, int> {
      ["Platinum"] = 7,
      ["Aluminum"] = 4,
      ["Titanium"] = 3,
    };

    foreach (var console in metal.OrderBy(x => x.Key)) {
      Console.WriteLine(console);
    }
  }
}

출력:

[Aluminum, 4]
[Platinum, 7]
[Titanium, 3]

OrderBy에 대한 대체 LINQ 메서드는 OrderByDesending이며 이름에서 알 수 있듯이 순서를 반대로 합니다. IOrderedEnumerable<TElement> 유형이므로 ThenByThenByDescending 메서드를 사용하여 추가 정렬 기준을 지정하여 사전을 정렬할 수도 있습니다.

또한 LINQ Reverse 메서드는 사전을 내림차순으로 정렬하는 OrderByDescending 메서드와 동일합니다.

예제 코드:

using System;
using System.Linq;
using System.Collections.Generic;

public class sortOrderByDescending {
  public static void Main(string[] args) {
    var metal = new Dictionary<string, int> {
      ["Platinum"] = 7,
      ["Aluminum"] = 4,
      ["Titanium"] = 3,
    };

    // LINQ `Reverse` method, which gives the similar output
    /*
    foreach (var item in fruit.Reverse())
    {
        Console.WriteLine(console);
    }
    */

    foreach (var console in metal.OrderByDescending(x => x.Key)) {
      Console.WriteLine(console);
    }
  }
}

출력:

[Titanium, 3]
[Platinum, 7]
[Aluminum, 4]

SortedList<TKey, TValue> 클래스를 사용하여 C#의 키를 기준으로 사전 정렬

이 메서드나 데이터 구조는 키를 해당 값에 매핑하고 사전과 유사하게 작동할 수 있으므로 이름이 오해의 소지가 있을 수 있습니다. 이진 검색 방식을 사용하여 키로 값을 찾고 특정 순서로 저장하여 사전을 정렬합니다.

IEqualityComparer<T>를 생성자에 전달하는 경우 SortedList<TKey, TValue> 메서드를 사용하여 구성 가능한 방식으로 키별로 사전을 정렬할 수 있습니다. 내부적으로는 목록을 효과적으로 사용하여 구현하므로 해시 코드로 조회하는 대신 이진 검색을 수행합니다.

유용하다는 것은 큰 목록을 작성할 수 있지만 복잡성을 피할 수 있기 때문에 성능 면에서 최적화되었다는 의미는 아닙니다. 이는 System.Collections.Generic 네임스페이스에 속하며 연관된 IComparer<T> 구현을 기반으로 합니다.

예제 코드:

using System;
using System.Collections.Generic;

public class sortedListExp {
  public static void Main(string[] args) {
    var metal = new SortedList<string, int> {
      ["Platinum"] = 7,
      ["Aluminum"] = 4,
      ["Titanium"] = 3,
    };

    foreach (var console in metal) {
      Console.WriteLine(console);
    }
  }
}

출력:

[Aluminum, 4]
[Platinum, 7]
[Titanium, 3]

SortedDictionary<TKey, TValue> 클래스를 사용하여 C#의 키를 기준으로 사전 정렬

로그 시간 검색 작업이 있는 이진 검색 트리로 구현되므로 키-값 쌍이 키에서 정렬되는 사전을 나타냅니다. 사전의 새 인스턴스(지정된 사전과 동일한 매핑 포함)를 초기화하고 키에 따라 정렬합니다.

이것은 O(log n) 검색이 있는 이진 검색 트리인 Generic 클래스에 속하며 n은 사전의 요소 수를 나타냅니다. SortedList<TKey, TValue>와 유사하지만 정렬되지 않은 데이터에 대한 삽입 및 제거 작업이 더 빠릅니다.

사전이 해시 테이블로 구현되는 동안 Red-Black 트리로 구현되므로 SortedDictionary를 사용하면 성능에 부정적인 영향을 미칠 수 있습니다. 그러나 중요한 성능 차이가 없는 경우 SortedDictionary를 사용하면 혼란을 덜 수 있습니다.

예제 코드:

using System;
using System.Collections.Generic;

public class sortedDictionaryExp {
  public static void Main(string[] args) {
    var metal = new SortedDictionary<string, int> {
      ["Platinum"] = 7,
      ["Aluminum"] = 4,
      ["Titanium"] = 3,
    };

    foreach (var console in metal) {
      Console.WriteLine(console);
    }
  }
}

출력:

[Aluminum, 4]
[Platinum, 7]
[Titanium, 3]

이 자습서에는 키별로 사전을 정렬하는 방법에 대해 설명하는 모든 내용이 포함되어 있으며 이 주제와 관련하여 있을 수 있는 혼란을 정리할 수 있습니다. 또한 궁극적인 성능을 유지하면서 이 작업을 수행하기 위해 몇 가지 새로운 메서드 또는 데이터 구조에 주의를 기울일 수 있습니다.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

관련 문장 - Csharp Dictionary