2009-05-12 2 views

답변

12

이는 키의 유형에 따라 크게 달라집니다. 그러나 그들이 문자열이라는 것을 가정 해 봅시다. 다음 LINQ 쿼리를 사용할 수 있습니다.

Hashtable table = GetHashTable(); 
var keys = table.Keys.Cast<String>().OrderBy(x => x); 

더 복잡한 구조의 경우 LINQ 쿼리는 약간 다릅니다. 당신은 LINQ 코드는 해시 테이블 (그들은 키의 균일 한 분포를 가지고 만들어진 위해 설계되었습니다 정말 무엇을 다음

Hashtable table = GetHashtable(); 
var keys = table.Keys.Cast<Name>().OrderBy(x => x.First).ThenBy(x => x.Last); 
+0

"기호 캐스팅을 해결할 수 없습니다."( –

+0

@SeasonedCoder : System.Linq를 포함해야합니다. http://msdn.microsoft.com/en-us/library/bb341406.aspx –

1

그게 될 핵심

struct Name { 
    public string First; 
    public string Last; 
    // Equality code omitted 
} 

에 대한 다음과 같은 정의를 가지고 가정하자). 정렬 된 트리를 사용 하시겠습니까?

+0

레거시 코드로 작업해야합니다. 지금은 SortedDictionary와 같은 것을 사용하기 위해 리팩토링하는 것을 매우 꺼려합니다.하지만 여전히 알파벳 순서로 키 (문자열)를 트래버스해야합니다. –

2

자연 순서대로 키를 유지하는지도를 원할 경우 Hashtable을 사용하지 마십시오. 여전히 1.1을 사용하고 있다면 System.Collections.SortedList을 사용하십시오. 2.0 이상을 사용하는 경우 SortedList<TKey, TValue> 또는 SortedDictionary<TKey, TValue>을 사용하십시오. 후자의 두 개는 이고 주로 API 측면에서 동일한이지만 성능 특성이 다릅니다. 자세한 내용은 문서를 참조하십시오.

SortedList settings = new SortedList(GetSettings()); 
foreach (object key in settings.Keys) 
{ 
    //logic 
} 

가 정렬 &을 만드는 - 그것은 아마 약간 빠른 사용하려면 SortedList 수 있습니다

 
Hashtable settings = GetSettings(); 
ArrayList keys = new ArrayList(); 
keys.AddRange(settings.Keys); 
keys.Sort(); 
foreach (object key in keys) 
{ 
    // Logic here 
}

+0

나는 SortedDictionary 아이디어를 좋아한다. Hashtable과 SortedDictionary 사이에 쉽게 캐스팅 할 수 있습니까? –

+0

아니요 - 별개의 유형입니다. 약간의주의를 기울여 Hashtable에서 새로운 SortedDictionary를 만들 수 있습니다. 하지만 어쨌든 .NET 2.0을 사용한다면 왜 Hashtable을 처음 사용합니까? O (1) 조회가 실제로 필요하지 않는 한 대부분의 경우 Hashtable을 SortedDictionary로 바꿀 수 있어야합니다. –

7

글쎄, 난 내 상황에 가장 적합이 조각을 발견 ArrayList는 O (n) + O (nlog n) = O (nlog n)이고 SortedList 생성자는 O (n)이므로 arraylist를 사용하는 대신 SortedList를 직접 사용하는 것이 빠릅니다 명시 적으로 정렬하려면

관련 문제