私が欲しいのは基本的に、辞書とリストのハイブリッドであるコレクションです。キーと値のペアを (ディクショナリのように) 追加できるコレクションが必要ですが、同時に (リストのように) 追加したのと同じ順序で (キーなしで) 値を取得できますか? そのようなコレクションは .NET に存在しますか?
ありがとう
私が欲しいのは基本的に、辞書とリストのハイブリッドであるコレクションです。キーと値のペアを (ディクショナリのように) 追加できるコレクションが必要ですが、同時に (リストのように) 追加したのと同じ順序で (キーなしで) 値を取得できますか? そのようなコレクションは .NET に存在しますか?
ありがとう
あなたが望むことをする、と呼ばれる非一般的なデータ構造がOrderedDictionary
あります。これには 2 つのインデクサーがありObject
ますint
。追加した順序で内容を列挙することもできます。
ディクショナリ ルックアップがO (1) (つまり高速) 動作を実現するかどうかについては、ドキュメントには何も表示されません。実装されていることを考えると、ISerializable
オブジェクトのハッシュ コードを使用する可能性が非常に高いため、O (1) ディクショナリ ルックアップがあります。
List<T>
aと a の両方をカプセル化する独自のジェネリック型を作成することもできますDictionary<TKey,TValue>
。
System.Collections.ObjectModel.KeyedCollectionは、辞書のキーが値から導出可能でなければならないことを除いて、あなたが求めているものに非常に近いものです。
いいえ、現時点ではこの機能を実装するフレームワークには何もありません(ただし、以下の編集を参照してください)。
基本的に、あなたはあなた自身のクラスでList<T>
とを構成したいと思うでしょう。Dictionary<TKey, TValue>
OrderedDictionary
編集:ウェズリーヒルが指摘したように、私は本当に忘れていました-しかし、このようなフレームワークにジェネリックコレクションがあるとは思いません。実際にジェネリックコレクションが必要だと思いますか?もちろん、ラッパーを書くこともできますOrderedDictionary
...
編集:クイックノート:コレクションをラップするのは難しいことではありませんが、一般的なコレクションの利点の1つであるボクシングの回避が失われます。もちろん、キーと値が参照型であれば問題ありません。
パフォーマンスモンスターではありませんが、うまく機能するはずです。それ以外の場合は、Java のように独自のLinkedHashMapを実装できます。
ところで、これを見てください: LinkedHashMap in .NET
編集: wesleyhills のアイデアがさらに好きです: List と Dictionary を 1 つのクラスにカプセル化します。両方に常に追加し、Dictionary.Values の代わりにリストを返します。