列挙のために辞書に追加されたアイテムの順序を当てにすることはできないと私は信じています。
キーを使用してアイテムを追加でき、追加順に列挙できる、またはキーで取得できるクラス (可能であればジェネリック) はありますか?
明確化: キーの順序で列挙したくありません。追加順に列挙したい。つまり、FIFO (先入れ先出し) ベースで列挙を介してアイテムを取得できるようにしたいということです。
列挙のために辞書に追加されたアイテムの順序を当てにすることはできないと私は信じています。
キーを使用してアイテムを追加でき、追加順に列挙できる、またはキーで取得できるクラス (可能であればジェネリック) はありますか?
明確化: キーの順序で列挙したくありません。追加順に列挙したい。つまり、FIFO (先入れ先出し) ベースで列挙を介してアイテムを取得できるようにしたいということです。
List
キーを加算順に格納するa を使用するだけで、必要な効果を得ることができます。次に、そのリストを順番に列挙し、から値を取得できますDictionary
。
ただし、これらすべてを単一の既存のコレクション型で実行したい場合、比較子を提供したり、キーを項目の一部にしたりせずにこれを行う型を私は知りません。前者の場合は試すことができSortedDictionary
、後者の場合は新しいコレクションを派生させることができますKeyedCollection
(これが比較子なしで順序を維持するかどうかは完全にはわからないため、実験して確認する必要があります)。
まず、あなたの主な仮定では、あなたは正しいです。通常の辞書は、列挙の順序について保証しません。
SortedDictionary
次に、カスタムIComparer
ルートを使用する場合は注意が必要です。比較器は、コレクションの並べ替えだけでなく、キーの同等性にも使用されます。つまりIComparer
、加算順序に基づくを使用するとSortedDictionary
、キー値で要素を取得するのが困難になる可能性があり、ツリー(ソートされた辞書の裏付け)で失われる可能性があります。
HashedLinkedList<KeyValuePair<T>>
C5 Generic Class Libraryルートを進んで使用する場合は、aから、またはHashedLinkedList<T>
Tがセルフキーである場合に、ある程度のマイレージを得ることができます。IEqualityComparer
キーを操作してハッシュコードを生成するを作成できます。次に、実際の値を取得Find(ref T x)
し、プロトタイプx(おそらくキーのみが設定されている)で使用できます。これにより、格納されているものが検索され、 O(1)時間とO(log n)のT
参照によって返されます。また、に裏打ちされているため、追加の順序で列挙することが保証されています(また、C5を使用して希望する方向を指定できます)。SortedDictionary
LinkedList
IDirectedEnumerable
お役に立てば幸いです。
独自のジェネリッククラスを作成し(Dictionary <、>またはSortedDictionary <、>から派生させる)、独自のバージョンのGetEnumerator()を実装して、キーで辞書を並べ替え、並べ替えられた値を返すことができます(またはSortedDictionaryを使用すると、すでに並べ替えられています)。
また、SortedList <、>を使用することもできます。これは、場合によってはより適切で軽量です。MSDNをチェックして、ニーズに最適なものを確認してください。
トピックは少し古いですが、同じ動作 (アイテムが追加された順序を保持) でコレクションをキーでインデックス化できるコレクションを探していました。答えは、抽象クラス KeyedCollection<> です! (System.Collections.ObjectModel 名前空間で) 辞書とこの keyedcollection を使用して簡単なテストを実行しました。何度も追加し、途中から 1 つを削除して、もう一度項目を追加しました。KeyedCollection は新しいアイテムを最後に追加し、Dictionary はそれを元の位置に配置します (そこで何らかのハッシュが行われていると思います)