본문 바로가기
C#

[C#] SortedDictionary<TKey,TValue>, SortedList<Tkey,TValue>, SortedList

by DANEW 2023. 9. 26.

SortedDictionary<TKey,TValue> 클래스

 

SortedDictionary<TKey,TValue> 클래스 (System.Collections.Generic)

키에 따라 정렬된 키/값 쌍의 컬렉션을 나타냅니다.

learn.microsoft.com

SortedList<TKey,TValue> 클래스

 

SortedList<TKey,TValue> 클래스 (System.Collections.Generic)

연관된 IComparer<T> 구현을 기반으로 키에 따라 정렬된 키/값 쌍의 컬렉션을 나타냅니다.

learn.microsoft.com

SortedList 클래스

 

SortedList 클래스 (System.Collections)

키를 기준으로 정렬되고 키와 인덱스로 액세스할 수 있는 키/값 쌍의 컬렉션을 나타냅니다.

learn.microsoft.com

반응형


- 요소들을 항상 키를 기준으로 정렬된 상태로 유지하는 사전 클래스


- SortedDictionary<K,V>
 * 적흑 트리 사용
 * 삽입 및 조회 상황에서 일관된 성능 보임
 * 색인이 불가능해 차례로 훑어야 함

 

- SortedList<K,V>, SortedList
 * 배열 2개 사용
 * 이진 검색을 사용하므로 조회는 빠르지만 삽입 성능은 나쁨
 * 키, 색인으로 요소에 접근 가능

// System.Reflection의 반영 기능을 사용해서
// object의 메소드들을 정렬된 사전에 채우고 그 값들을 나열함
 
// 오버로드 된 경우가 있을 수 있으므로
// 하나의 키에 여러개의 MethodInfo가 기록되어 있어야 하기에 List를 사용
 
// 키(TKey)  : 메소드 이름(string)
// 값(TValue): 메소드들의 정보(List<MethodInfo>)
var sortedList = new SortedDictionary<string, List<MethodInfo>>();
 
// 각 메소드에 대해서
foreach (var item in typeof(object).GetMethods())
{    
    List<MethodInfo> tempInfo;
 
    // 해당 키가 이미 등록되어 있지 않다면
    // 즉, 첫 등록하는 경우
    if (!sortedList.TryGetValue(item.Name, out tempInfo))
    {
        // 리스트를 새로 만들고
        tempInfo = new List<MethodInfo>();
 
        // 사전에 리스트를 연결해준다
        sortedList[item.Name] = tempInfo;
    }
    // 그 이후 내용 추가
    tempInfo.Add(item);
}
 
// 키를 기준으로 키 이름들을 확인
foreach (var item in sortedList.Keys)
{
    Console.WriteLine(item);
}
Console.WriteLine();
 
// 값을 기준으로 값에 대한 정보들을 확인
foreach (var item in sortedList.Values)
{
    // 값은 List로 구성되어 있으므로 List를 열거
    foreach (var innerItem in item)
    {
        Console.WriteLine($"{innerItem.Name.PadLeft(20)} | ReturnType: {innerItem.ReturnType.ToString().PadLeft(15)} | IsVirtual: {innerItem.IsVirtual}");
    }    
}

- 위 코드는 SortedDictionary<TKey,TValue>와 SortedList<TKey,TValue> 양 쪽을 모두 호환

- 단, 컬렉션의 Keys, Values에 대한 색인 접근을 시도 할 시 List에서만 동작

 

반응형