C#에서 키로 사전 정렬
-
OrderBy()
LINQ 메서드를 사용하여C#
의 키를 기준으로 사전 정렬 -
SortedList<TKey, TValue>
클래스를 사용하여C#
의 키를 기준으로 사전 정렬 -
SortedDictionary<TKey, TValue>
클래스를 사용하여C#
의 키를 기준으로 사전 정렬
C#에서 사전은 해시 테이블
로의 구현을 반영하는 거의 일정한 시간 조회를 허용합니다. 즉, 본질적으로 정렬되지 않음을 의미합니다. 사전에는 미리 정의된 정렬 방법이 없으므로 사전의 요소를 별도로 획득하여 정렬할 수 있습니다.
첫 번째 방법은 OrderBy()
LINQ 방법을 사용하는 것입니다. 그러나 모든 항목을 정렬해야 하므로 O(n*log(n))
성능이 가장 좋지 않습니다. 키로 사전 요소에 반복적으로 액세스해야 하는 경우 SortedList
또는 SortedDictionary
를 사용하면 품질을 손상시키지 않고 이 목적을 달성하는 데 도움이 될 수 있습니다.
선형 시간 O(n)
에서 순서대로 요소 목록을 추출할 때 조회 및 삽입 시간에서 일부 성능이 손실될 수 있습니다. 이 자습서에서는 C#에서 키를 기준으로 사전을 정렬하는 세 가지 가능한 방법을 배웁니다.
OrderBy()
LINQ 메서드를 사용하여 C#
의 키를 기준으로 사전 정렬
이 LINQ 메서드를 사용하면 프로그래머가 사전에서 KeyValueParts
의 IOrderedEnumerable
을 추출하여 키별로 정렬할 수 있습니다. 사전은 요소를 순서대로 저장할 수 없기 때문에 사전의 정렬은 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>
유형이므로 ThenBy
및 ThenByDescending
메서드를 사용하여 추가 정렬 기준을 지정하여 사전을 정렬할 수도 있습니다.
또한 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]
이 자습서에는 키별로 사전을 정렬하는 방법에 대해 설명하는 모든 내용이 포함되어 있으며 이 주제와 관련하여 있을 수 있는 혼란을 정리할 수 있습니다. 또한 궁극적인 성능을 유지하면서 이 작업을 수행하기 위해 몇 가지 새로운 메서드 또는 데이터 구조에 주의를 기울일 수 있습니다.
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