2011-09-22 11 views
9

私は内部に複数のキー値のペアを持つ辞書構造を持っています。辞書の最初の要素として挿入する方法は?

myDict.Add(key1, value1); 
myDict.Add(key2, value2); 
myDict.Add(key3, value3); 

私の辞書には、いくつかのコントロールのデータソースとして使用されています。コントロールのドロップダウンでは、次のような項目が表示されます。

key1 
key2 
key3 

順序は私の辞書と同じです。 私は辞書がarrayListのようではないことを知っています - あなたはインデックスなどを得ることができます。 sortedDictionaryは使用できません。 今、私は私のプログラムのいくつかの点で、この辞書に1以上のキーと値のペアを追加する必要があると私は私がこれを行うと、それは同じ効果を持っている願っています:

myDict.Add(newKey, newValue); 
myDict.Add(key1, value1); 
myDict.Add(key2, value2); 
myDict.Add(key3, value3); 

私はこれを行う場合、私はNEWKEYが表示されます知っています最初の要素として私のコントロール。

私は、tempDictを作成tempDictにmyDictの各ペアを配置するアイデアを持っている、そして明確なmyDictが、当時このようなペアを追加:

myDict.Add(newKey, newValue); 
myDict.Add(key1, value1); 
myDict.Add(key2, value2); 
myDict.Add(key3, value3); 

はこれよりも良い方法はありますか?

ありがとうございます!

答えて

19

Dictionary<K,V>があります。知覚された注文保守は、偶然であり(バケツの選択順序および数を含むが、これに限定されない特定の実装の成果物)である。

これらは私が知っている(ただBase Class Libraries BCLを使用して)のアプローチです:

  1. Lookup<K,V>
    • 不変.NET4は、複数のキーを値にマッピングすることができます(ビルド時に重複を見る)
  2. OrderedDictionary
    • 予期しない、マンスの境界は(
  3. List<KeyValuePair<K,V>>
    • .NET2/3大丈夫、変更可能な、より多くの取材、複数の値にキーをマップすることができます(他の2つのアプローチは、 "(キー)/セット(キー)を取得する" ためのO(n)です)

ハッピーコーディング)を挿入して重複を見ます。


挿入順序を維持するハッシュデータ構造を作成することは、実際には標準的なハッシュ実装のわずかな変更です(Rubyハッシュは現在挿入順序を維持しています)。しかし、これは.NETでは行われておらず、さらに重要なのはDictionary/IDictionary契約の一部でもあります。

+0

Lookup の "watch inserts"とはどういう意味ですか? Lookup に値を挿入するときに注意が必要なことを意味しますか?もしそうなら、Lookup は不変なので、それは真実ではない。 – phoog

+0

@phoog複数の値に対して単一のキーを扱うことができるので、辞書では不可能な状況につながる可能性があります。文言は理想的ではありませんでした。 –

+0

+1ですが、私のコントロールにはデータソースを供給するための辞書が必要です。私たちはコントロールを変更したくありません。 –

1

辞書を使用しない - 要素を追加するときにキーの順序が変わらないという保証はありません。代わりに、Key-Value-Pairs(ここではWhat is C# analog of C++ std::pair?の例をご覧ください)のクラスPairを定義し、データソースにList<Pair>を使用してください。 ListにはInsertの操作があり、リストのどこにでも新しい要素を挿入することができます。辞書(処理鍵、TValue)にMSDNページから

+0

この未解決の回答は – spspli

+1

@spspli:良い医者が言っていることは、 'Dictionary 'の基本を無視しないということです。したがって、データ構造を変更するか、順序のないコレクションを使用して生きることになります。 – user7116

+3

コントロールに特定のリスト形式の要素を表示させ、唯一許可されているデータソースが特定の順序を提供しない辞書である場合、コントロールが誤って設計されていて、問題。だからあなたがコントロールを変更するか、別のコントロールを使うか、注文情報を外部からどこかに取得する別の方法がある場合は、コントロールについてもっと知ることができます。 –

2

:列挙の目的のため

、辞書の各項目は、KeyValuePair <(<の(処理鍵、TValue>)>)構造として扱われます値とそのキーを表します。アイテムが返される順序は未定義です。

あなたのデータソースが辞書であるため、SortedDictionaryを使用できないと仮定しています。コントロールがディクショナリタイプとソートされたデータの両方を必要とする場合、コントロールは相互に矛盾するので、コントロールを変更する必要があります。 は、並べ替え/並べ替え機能が必要な場合は別のデータ型を使用する必要があります。定義されていない動作に応じて、問題を尋ねています。

5

Dictionaryクラスではこれを行うことはできません。あなたの例では、データ構造が実装されている様子が奇抜であるために働いています。データ構造は実際にはエントリを一時的な順序で1つの配列に格納し、次に別の配列を使用してエントリ配列にインデックスを付けます。列挙はエントリ配列に基づいています。それがあなたの場合に発注されたように見える理由です。しかし、一連の除去および挿入操作を適用すると、この順序付けが乱されることに気づくでしょう。

代わりにKeyCollectionを使用してください。これは、キーとインデックスの両方によるO(1)検索を提供し、一時的な順序付けを保持します。

+0

+1私は以前KeyCollectionについて知っていましたが(なぜ、ComponentModel名前空間でそれがオフになっていて、それが拡張に依存しているのですか: - /) –

+0

@pst:わかりません。 –

+0

+1 [KeyedCollection](http://msdn.microsoft.com/en-us/library/ms132438.aspx)は、私が探していたものです。 – Ben

1

辞書オブジェクトのソートには使用しないでください。オブジェクトを検索するために使用する必要があります。あなたはそれもオブジェクトを並べ替える必要がある場合は、私は何か他のことを示唆しています。

ディクショナリを展開すると、リストの混乱を防ぐルールはありません。

関連する問題