1

ここの例を参照してください。値をこの順序で保存しました! しかし、私が得ている出力は異なります! なんで?値を格納するハッシュテーブルの順序は?

      {               
        Hashtable ht = new Hashtable();
        ht.Add("001", "Zara Ali");
        ht.Add("002", "Abida Rehman");
        ht.Add("003", "Joe Holzner");
        ht.Add("004", "Mausam Benazir Nur");
        ht.Add("005", "M. Amlan");
        ht.Add("006", "M. Arif");
        ht.Add("007", "Ritesh Saikia");

        ICollection key = ht.Keys;

        foreach (string k in key)
         {
            Console.WriteLine(k + ": " + ht[k]);
         }

       }

出力

006: M. Arif
007: Ritesh Saikia
003: Joe Holzner
002: Abida Rehman
004: Mausam Benazir Nur
001: Zara Ali
005: M. Amlan
4

3 に答える 3

4

Hashtable は、内部の要素に対して定義された順序を保証しません。ハッシュテーブルの実装は、ハッシュコードとその内部実装に基づいて値を異なるバケットに分割します。つまり、同じ値が異なるマシン、異なる実行、またはフレームワークの異なるバージョンで異なる順序になる可能性があります。これは、ハッシュテーブルが順序による検索ではなく、キーによる検索に最適化されているためです。

キーと順番の両方でアクセスできるコレクションが必要な場合は、特殊化されたコレクションのいずれかを使用します。Hashtableではなくを使用していることから判断すると、Dictionary<K,V>.NET 1.1 を使用している可能性があります。その場合、SortedList内部で順序を維持するために which を使用できます。新しいバージョンの .NET にはSortedList<K,V>OrderedDictionary<K,V>があり、パフォーマンス特性が少し異なります。

于 2014-12-22T07:23:18.907 に答える
3

SortedDictionary<K, T>obsolete の代わりに使用できますHashTable

SortedDictionary<String, String> ht = new SortedDictionary<String, String>() {
  {"001", "Zara Ali"},
  {"002", "Abida Rehman"},
  {"003", "Joe Holzner"},
  {"004", "Mausam Benazir Nur"},
  {"005", "M. Amlan"},
  {"006", "M. Arif"},
  {"007", "Ritesh Saikia"}
};

foreach(var pair in ht)
  Console.WriteLine(pair.Key + " " + pair.Value);

, Dictionary<K, T>, ( e と同様に廃止Set<T>されていることに注意してください)は、使用しなければならない順序を保持しませんHashTableHashTablICollectionSortedDictionary<K, T>SortedSet<T

于 2014-12-22T07:27:35.070 に答える
1

Hashtable は任意の順序を保証しませんDictionary<string, string>。必要に応じて値で並べ替えることができます。これを使用することもできますがSortedDictionary<string, string>、デフォルトではキーでソートされています。

        Dictionary<string, string> ht = new Dictionary<string, string>();
        ht.Add("001", "Zara Ali");
        ht.Add("002", "Abida Rehman");
        ht.Add("003", "Joe Holzner");
        ht.Add("004", "Mausam Benazir Nur");
        ht.Add("005", "M. Amlan");
        ht.Add("006", "M. Arif");
        ht.Add("007", "Ritesh Saikia");

        var order = ht.OrderBy(x => x.Value);//ht.OrderBy(x => x.Key);

        foreach (var k in order)
        {
            Console.WriteLine(k.Key + ": " + k.Value);
        }
于 2014-12-22T07:30:17.957 に答える