私は通常キーを使ってアクセスする辞書を持っているので、高速のランダムアクセス読み取りが必要です。ただし、1つの関数では、順序が重要な辞書内のすべての項目を処理する必要があります。テストでは問題なく動作しているようです。辞書の項目の順序に依存しても大丈夫ですか?
5 に答える
いいえ。注文を続ける必要がある場合は、アイテムのリストも用意する必要があります。必要なすべての操作を独自のコレクションクラスにカプセル化すると、ディクショナリとリストの両方が同時に更新されます。
LinkedHashMapのように、.NETにこれ自体をサポートする辞書がないことは残念です-それはかなり一般的な要求です-Javaにはあります。
ドキュメントに記載されているように、追加した順序で結果を返す Dictionary<> に頼ることは絶対にできません。
テストでは、Dictionary<> は常に、追加されたのと同じ順序で KeyValuePairs<> を列挙しているようです。ただし、Dictionary<> の Mono 実装はそうではありません。Mono は動作を実装するときにドキュメントに従います。ドキュメントのその部分を見て、順序を維持しない何らかの方法で実装したと思います。
別のオプションは、順序を維持するOrderedDictionary を使用することです。
tpower
、Dictionary
およびSortedDictionary
両方がオブジェクトのコレクションを保持し、キーでアクセスできるという点で非常に似ています。それらが異なるのは、内部で構築される方法です。
Dictionary
私の知る限り、挿入は高速ですSortedDictionary
が、二分木検索アルゴリズムの上に構築されており、読み戻しが高速です。
ただし、どちらの状況でも、内部順序はキー順序によって維持されます。コレクション全体で繰り返す順序が、アイテムを挿入したときと同じになることを保証するものは何もありません。
この場合、さまざまな要件に合わせてリストと辞書の両方を保存する必要がある場合があります。
いいえ。キーを順番に保持したい場合は、 SortedDictionaryを使用することをお勧めします。
編集:それか、アイテムを追加した順序を追跡したい場合は、リンクリストにキーを追加します。
ドキュメントには、「列挙のために、ディクショナリ内の各項目は値とそのキーを表す KeyValuePair<(Of <(TKey, TValue>)>) 構造として扱われる」と明確に記載されています。項目が返される順序は未定義。」しかし、私は確信していません。
私が実行したすべてのテストでは、項目は常に挿入順に並べられています。
HashMap と LinkedHashMap (Java で) もテストし、HashMap の順序が正しくないため、これは奇妙に感じましたが、Jon Skeet が言ったように、LinkedHashMap の順序は正しくありません。
誰でも Dictionary でテストの失敗を指摘できますか?
テストに使用するコードは次のとおりです。
IDictionary<string, int> dic = new Dictionary<string, int>(10);
Console.WriteLine("Adding ...");
for (int i = 0; i < 1000000; i++)
{
Guid guid = Guid.NewGuid();
dic.Add(guid.ToString(), i);
}
Console.WriteLine("Testing ...");
bool first = true;
int lastItem = 0;
foreach (var item in dic.Values)
{
if (first)
{
first = false;
}
else
{
if (lastItem != item - 1)
{
Console.WriteLine("Test Failed !");
break;
}
}
lastItem = item;
}
Console.WriteLine("Done.");