辞書の順序付けされていない性質を理解する
「順序付けされていない辞書」の概念は、特に次のようなプログラムを考慮する場合、直観に反するように思えるかもしれません。
挿入順序とキー順序付け
.NET のディクショナリは、挿入またはキー値によって要素の順序を本質的に保持しません。これは、要素が定義されたシーケンスに従うリストや配列とは異なります。 「不規則性」は、キーとそれに対応する値の間に事前定義された関係がないことに関連しています。
例 1: 変数の挿入順序
次のコードは、潜在的な不確実性を示しています。値の順序に関して:
var test = new Dictionary<int, string>(); test.Add(3, "three"); test.Add(2, "two"); test.Add(1, "one"); test.Add(0, "zero"); Console.WriteLine(test.ElementAt(0).Value);
期待される出力は順序の解釈によって異なります。ある人は「挿入順序」を想定して「3」を予想するかもしれませんが、別の人は「キー順序」を好み「0」を予想するかもしれません。ただし、どちらの順序も保証されていないことに注意することが重要です。
例 2: 削除と再ハッシュの影響
削除と再ハッシュは、この動作にさらに影響を与える可能性があります。たとえば、次のプログラム:
var test = new Dictionary<int, string>(); test.Add(3, "three"); test.Add(2, "two"); test.Add(1, "one"); test.Add(0, "zero"); test.Remove(2); test.Add(5, "five"); foreach (var pair in test) { Console.WriteLine(pair.Key); }
は、必ずしも期待どおりにシーケンス (3、5、1、0) を出力するとは限りません。キーと値のペアは、再ハッシュやその他の内部最適化により、異なる位置を占める場合があります。
結論
辞書は、キーと値のマッピングではなく、効率的な保存と取得を優先します。注文した手配よりも。特定の実装には順序付けの特性が見られる場合がありますが、これらの動作に依存するのは賢明ではありません。予期しないエラーや一貫性のない結果を避けるために、辞書は現在順序付けされているように見えても、常に順序付けされていないコレクションとして扱います。
以上が.NET 辞書が挿入やキーの順序を保証しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。