2009-05-12 10 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>を使用してください。後者の2つは,でAPIは同じですが、パフォーマンスの特性が異なります。詳しくは、ドキュメントを参照してください。

+0

私はSortedDictionaryのアイディアが好きです。 HashtableとSortedDictionary を簡単にキャストする方法はありますか? –

+0

いいえ - 別々のタイプです。 Hashtableから新しいSortedDictionaryを作成できます。ちょっとした注意が必要です。とにかく.NET 2.0を使用しているのであれば、なぜHashtableを最初に使用していますか? O(1)ルックアップが本当に必要な場合を除き、ほとんどの場合、HashtableをSortedDictionaryに置き換えることができます。 –

7

まあ、私はこのスニペットは、私の状況に最も適していることが判明:

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

1

それはおそらくSortedListのを使用するために、わずかに速くなるだろう -

ソート&を作成
SortedList settings = new SortedList(GetSettings()); 
foreach (object key in settings.Keys) 
{ 
    //logic 
} 

ArrayListはO(n)+ O(nlog n)= O(nlog n)ですが、SortedListコンストラクタはO(n)であるため、arraylistを使用するのではなくSortedListを直接使用する方が速くなります明示的にソートすると

関連する問題