ハッシュテーブルのキーをアルファベットの昇順でトラバースする最も簡単な方法は何ですか?
5 に答える
これは、キーのタイプにかなり依存します。しかし、それらが文字列であると少しの間仮定しましょう。次のLINQクエリを使用できます
Hashtable table = GetHashTable();
var keys = table.Keys.Cast<String>().OrderBy(x => x);
より複雑な構造の場合、LINQクエリはわずかに異なります。キーに対して次の定義があると仮定します
struct Name {
public string First;
public string Last;
// Equality code omitted
}
LINQコードは次のようになります
Hashtable table = GetHashtable();
var keys = table.Keys.Cast<Name>().OrderBy(x => x.First).ThenBy(x => x.Last);
さて、私はこのスニペットが私の状況に最も適していることを発見しました:
ハッシュテーブル設定=GetSettings(); ArrayListキー=newArrayList(); keys.AddRange(settings.Keys); keys.Sort(); foreach(キーのオブジェクトキー) {{ //ここのロジック }
キーを自然な順序で保持するマップが必要な場合は、最初から使用しないことをお勧めしますHashtable
。まだ 1.1 を使用している場合は、System.Collections.SortedList
. 2.0 以降を使用している場合は、 または を使用しSortedList<TKey, TValue>
ますSortedDictionary<TKey, TValue>
。後者の 2 つは、API に関してはほとんど同じですが、パフォーマンス特性が異なります。詳細については、ドキュメントを参照してください。
これは、ハッシュテーブルが実際に設計されている目的ではありません(キーが均一に分散されるように作成されています)。ソートされたツリーを使用しますか?
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) であるため、SortedList を直接使用する方が高速です。 arraylist を使用して明示的にソートするよりも