2013-08-19 13 views
5

私はDictionary<string, Item>を使用して自分のアイテムを保管しています。
辞書を使用する理由は、キーが一意でアクセスが高速であるためです。辞書アイテムの注文

ほとんどの場合、私は単一の項目にアクセスするためにのみ、辞書を使用します。しかし、あるケースでは、私は辞書をループする必要があります - ここでは、アイテムを追加するためにそれらを追加する必要があります。

辞書は内部的にハッシュテーブルを使用していますが、どのように構成されているのか分かりません。

質問:
ディクショナリ内の項目は、追加された順番に並べられていますか?
商品が追加または削除された場合、注文はどうなりますか?

+0

順序付けられた辞書には、C#で 'OrderedDictionary'を使用できます。MSDNを参照してください。http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx – wudzik

+0

この素晴らしい答えを見てみましょう同じ話題で http://stackoverflow.com/questions/6384710/why-is-a-dictionary-not-ordered?rq=1 –

+1

@KingKing: 'OrderedDictionary'もHashTable(配列の横に)として実装されていますが、順序付けられました。しかし、たとえそれがHashTable実装であることが分かっていても、必ずしもそれが本質的に順序付けられていないことを知る必要はありません。 –

答えて

4

これらは一切注文されていません。辞書内の要素の順序は非決定的です。

MSDN: "The order in which the items are returned is undefined."

あなたは、インデックスを経由してアイテムにアクセスするには代わりにOrderedDictionaryを使用することができます。または、キーで注文する場合はSortedDictionaryを使用します。

更新Why is a dictionary not ordered by nature

+0

.NET 4.5のOrderedDictionaryについての情報が含まれているのでベスト回答です。 – wudzik

+0

SortedDictionaryクラスの警告語で、検索はO(ログn)になり、挿入がさらに悪化します。 – flindeberg

+0

@wudzik 'OrderedDictionary'は.Net 2以降 –

0

ディクショナリは一切注文されていないため、そこの値に頼ることはできません。 OrderedDictionaryをお試しください。あなたは、Microsoftのlibraryで読むことができるよう、

No generic implementation of OrderedDictionary?

+0

@wudzikこれは.NET 2以降のものですが、一般的ではありません。私が投稿したリンクは、そのための一般的な実装を示しています。 – Artless

+0

大丈夫、申し訳ありません、私の悪い: – wudzik

0

いいえ、彼らが注文されていない:

を列挙する目的のために、各項目をあなたは一般的なものを好む場合は、次のリンクをご確認ください辞書は の値を表すKeyValuePair構造体とその というキーとして扱われます。アイテムが返される順序は未定義です。

1

あなたはthe msdn pagesを見てみると、あなたが

(あなたの最初の質問のために)アイテムが返される順序は未定義であることがわかります。

2番目の質問の答えは、ハッシュテーブルによって実装されているということです。

あなたの実際の要件が何であるかわからなくても、より良い行動を推奨することはできません。しかし、複数のキーと並べ替え順序を使いこなすとすぐに、O(1)検索が失われます。

関連する問題