.netにOrderedDictionaryの一般的な実装がないのはなぜですか?


26

なぜMicrosoftはOrderedDictionaryの一般的な実装を提供しなかったのですか?

私が見たいくつかのカスタム実装があります:http : //www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx

しかし、なぜMicrosoftはそれをベース.netライブラリに含めなかったのですか?確かに、ジェネリックを作成しない理由がありましたが...それは何ですか?

このメッセージを投稿する前に、私は見ました:https : //stackoverflow.com/questions/2629027/no-generic-implementation-of-ordereddictionary

しかし、それはそれが存在しないことを確認するだけです。ないなぜそれが存在していません。

ありがとう


2
常にありますSortedDictionary<TKey, TValue>msdn.microsoft.com/en-us/library/f7fta44c.aspx
トラビス

2
SortedDictのドキュメントを誤解しない限り、それは私が望むものではありません。並べ替えを行わないでください。キーでアクセスできる配列だけが必要です。とにかく、なぜMSがこれをスキップしたのか、本当に不思議に思っています。(微妙な問題など)
-nonot1

順序付けされた辞書の典型的な使用例は何ですか?私は頭の上のものを考えるのに苦労しています。
カーソン63000

1
@Carsonは、いつでもすばやくランダムにアクセスする必要があるデータ項目の配列を持っています。単純にDictに格納すると順序付け情報が失われ、配列を使用するには独自のインデックスを維持する必要があります。
-nonot1

2
Eric Lippertに質問を読んで答えてもらいます。彼は通常、このタイプの質問を手伝うことに非常に同意します。彼のブログ(blogs.msdn.com/b/ericlippert
devuxer

回答:


17

ではC#4.0ではA一言で言えば、私はこれを読んで:

  1. OrderedDictionaryAの組み合わせであるHashTableArrayList
  2. ジェネリックはありません ArrayList
  3. 「非ジェネリックArrayListクラスは、主にFramework 1.xとの下位互換性のために使用されます...」
  4. 「An ArrayListは機能的に似ていますList<object>
  5. 「非ジェネリックの方が反射ArrayListよりも簡単ですList<object>

結論?

いいえ、一般的なOrderedDictionary、それは根本的な構造だからでは何のジェネリックバージョン自体を持っていません(非公式)減価償却クラスではありません。


4
これは本当に質問に答えません。汎用のOrderedDictionaryは、明らかに汎用の辞書と汎用のリストに基づいて構築できます。
ジャックB

クラスの使用の1つの教訓は、UIが実装を気にする人を変えない場合ですか?さて、言語設計/コンパイラチームは、非ジェネリックを継承するジェネリックを好むかもしれません。私のスパイシーな感覚が揺れる。手始めに:異なる(即時の)先祖は、共分散と反分散の進化経路のどこかで 地雷OrderedDictionaryですか?
レーダーボブ

15

OrderedDictionaryオーバーロードインデックス操作の整数でそのインデックスは、ようNな位置にアイテムを取得するNとインデックス作成中に、Objectそのオブジェクトにcorespondingアイテムを取得します。OrderedDictionary<int, string>呼び出されたを作成し、myDictアイテム(1、 "George")と(0、 "Fred")をこの順序で追加した場合、myDict[0]"George"または "Fred" を返す必要がありますか?

このような問題は、キータイプにクラス制約を課すことで解決できた可能性があります。一方、ジェネリックコレクションの有用性の多くは、値の型を効率的に操作する能力に起因しています。キータイプにクラス制約を課すことは少しいように思えます。

クラスがCLS準拠である必要はなく、単にvb.netで動作する必要がある場合、名前付きインデックス付きプロパティを使用するのが賢明な設計であった可能性があります。したがって、上記の例でmyDict.ByKey[0]は、「Fred」が生成され、myDict.BySequence[0]「George」が生成されます。残念ながら、C#のような言語は、名前付きインデックス付きプロパティをサポートしていません。1でも、このような特性をすることなく、上記の構文を使用することができるように適当に組みあわせた何かを持っている可能性がありますが、不幸な決定は、同様の構造の分野ラップするPointRectangleのためにという意味をmyDict.ByKey[0] = "Wally"仕事に、myDict.ByKey新しいクラスのオブジェクトを返す必要があります。構造体はより効率的ですが、コンパイラーは、読み取り専用構造体への書き込みのように見えるものを拒否します(プロパティは、返される構造体を変更しませんが、ByKey、代わりに参照を保持するコレクションを変更します)。

個人的には、挿入順序を追跡するように指定された辞書風のオブジェクトがあればいいと思います。また、特定のキーに関連付けられたキーを簡単に返すことができる辞書風のオブジェクトが必要です(たとえば、大文字と小文字を区別しない辞書があり、「GEORGE」というキーを持つレコードを追加した場合、KeyValuePair列挙で返されるすべてのオブジェクトを検索することなく、「George」に関連付けられているキーを辞書に問い合わせることができます。


3

順序を維持すると、2つのコレクション(順序用、ルックアップ用)をラップしない限り、IDictionaryが示すO(1)ルックアップが妨げられるため、追加/削除のパフォーマンスが低下し、メモリ使用量が増加します。または、メモリ使用量を少なくするために、エクスチェンジのルックアップを遅くすることもできます。

私の推測では、ここには「明らかに良い」選択肢はなかったので、標準ライブラリには入りませんでした。特に2.0前後では、C#はJavaの間違いからまだ学んでいました。Javaの標準ライブラリのコレクションに対するJavaの「すべてと台所の流し」アプローチが、同様に避けるべきものであると見なされたとしても、私は驚かないでしょう。


1
少ないメモリと引き換えにルックアップを遅くすると、OrderedDictionaryaが効果的になりListます。私OrderedDictionaryは、O(1)ルックアップがあり、挿入順序も記憶しているコレクションクラスを必要とするため、正当なユースケースを持つ人が特にそれを使用していると想像します。
Abion47
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.