私はすでに公式MSDN docを読んでいます。この質問は少し異なっている - 私の代わりに理論ディクショナリ/ハスタブル壊れた注文のエッジケース(既存の例が必要です)
条件の実際の実用的な例を探しています:辞書/ hastableエントリはONLY追加することができます
- 辞書/ hastableエントリ(最初にクリアされない限り)
- 辞書/ハスタブルはVALUEタイプのみで動作しています
- 辞書/ハスタブルは他の方法で変更されることはありませんが、追加要素
- 辞書/ hastableは常に0から始まり、インデックスは簡単なコードロジック
- て辞書のキー自体(キー名)に保存され、手動で
コードサンプルを変更されることはありません:
Dictionary<int, int> test = new Dictionary<int, int>();
for (int i = 0; i <= 100000; i++)
{
test.Add(i,i);
}
var c = 0;
while (c < test.Count)
{
if (c != test.ElementAt(c).Key)
{
Console.WriteLine("Mismatch!");
break;
}
c++;
}
Console.WriteLine("Test passed!");
//Program takes a 2hrs walk, does things, occasionally reads-only values from existing "test" collection
for (int i = 0; i <= 500000; i++)
{
test[test.Count] = test.Count;
}
c = 0;
while (c < test.Count)
{
if (c != test.ElementAt(c).Key)
{
Console.WriteLine("Mismatch!");
break;
}
c++;
}
Console.WriteLine("Test 2 passed!");
//repeat some stuff
質問:上記の厳格な規則UNDER- 辞書ランドのこの種の誰もが、実際にケースが発生しましたその要素の順序を変更しないでください。ここではMT同時コレクションについて話されていないと、再び、私は
test.ElementAt(5).key
がkey
が11
か115
である返す単一の例I've read them.は、私が探しているものです、理論の答えに興味がないんです。
'Dictionary'のソースコードは、[ここ](http://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,3b9a0882313262cd)にあります。 ['Enumerator.MoveNext()'](http://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,d864a2277aad4ece,references)を見ると、 '' Dictionary 。 –
dbc
そして、あなたが['private void Insert(TKey key、TValue value、bool add)'](http://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,fd1acf96113fbda9,references)を見ると、 )空きエントリがない限り、*追加されたアイテムは 'entries'配列の最後に置かれ、再ハッシングはこの順序を変更しません。だから、**この実装では、**何も削除されない限り、辞書は物事が追加される順序を保持しているようです。 – dbc
**これは単なる実装の詳細です**モノラル(または将来の.Netバージョン、たとえば.Netコア3.5または.Netフル5.2など)の 'Dictionaryのバージョンは書き直すことができました辞書を再ハッシュすると順序が変わるようにします。 [documentation](https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx)の唯一の約束は、次のことです。*アイテムが返される順序は未定義です*だからもっと何かに頼るのは賢明ではないでしょう。 –
dbc