0

Dictionaryキーと値が両方とも文字列であるところがあります。を使用してキーの値を取得することができます[]。しかし、[]は文字列を期待しています。文字列キーの代わりに数字を使用してキーの値を取得することは可能ですか?

Dictionary<String, String> m_GermanEnglish = new Dictionary<String, String>();
m_GermanEnglish.Add("der", "the");
4

5 に答える 5

6

インターフェイスは、IDictionary辞書を列挙するときにアイテムの順序を保証しません。辞書は本質的に順序付けされていません。したがって、コレクションは順序付けされていないため、「位置1のアイテム」のようなものはありません。

辞書を列挙するたびに、アイテムが異なる順序で表示されることは有効です。

インデックスによってアイテムにもアクセスする必要がある場合は、IOrderedDictionary実装などの別のデータ構造が必要です。ここには、基本的にリストを辞書と並べて保持し、インデックスによるアクセスを提供するものがあります。

于 2012-06-12T15:48:06.850 に答える
4

LINQを使用できます

m_GermanEnglish.ElementAt(index);

しかし、あなたはあなたが知らないか、保証されている実装に依存しています。辞書は、要素が特定の順序であることを保証するものではありません。

于 2012-06-12T15:48:21.293 に答える
3

アイテムには明白な意味で序数がなく、キーをインデックスとして公開するだけなので、序数で辞書にインデックスを付けることはできません。辞書も順序を保証するものではありません。キーを追加または削除すると、「メモリ位置」の観点から、そのキーがどこに到達するかは不確定になります。

序数のインデックスでデータを取得したい場合は、ではなく別のコレクションが必要だと思いますDictionary<>

おそらくList<Tuple<string, string>>?明らかに、これは重複したサポートを提供しませんが、アイテムをペアリングしてインデックスを提供することができます。

于 2012-06-12T15:44:07.297 に答える
2

ディクショナリ内のアイテムの順序は未定義です。http://msdn.microsoft.com/en-us/library/ekcfxy3x.aspx つまり、値の収集の順序は、キーと同じ順序であることが保証されているだけです。ただし、Dictionaryはそれらを変更する権利を留保します。

その他のオプション:古いNameObjectCollectionを見ることができます-それはあなたが求めていることを行いますが、ジェネリックよりも古いので、それは単なるオブジェクトの辞書です(そして、Reflectorを使用してNameObjectCollectionを表示すると、それらが同じことをしたことがわかります事-彼らは実際に2つのコレクション、HashTableとListを実装しています)。

それらをリストにのみ保存し、LINQを使用して検索することもできますが、これが適切なソリューションであるかどうかは、保存する必要のあるアイテムの数によって異なります(辞書検索はO(1)、リスト検索はO(n)になります)一番。

于 2012-06-12T15:49:25.380 に答える
1

System.Linq名前空間の拡張関数を使用すると、次のことができます。

var indexedDictionary = m_GermanEnglish.ToArray();
var pairAt0 = indexedDictionary[0];

.ToListの代わりに拡張関数を使用することもできます.ToArray。どちらもオブジェクトのコレクションを返しKeyValuePair<TKey, TValue>ます。

注:ディクショナリのエントリは、必ずしもそれらが配置された順序と同じ順序でソートされているとは限りません。

ディクショナリ内のキーと値のペアに対して特定の順序を維持する必要がある場合は、SortedDictionaryまたはSortedListのいずれかを使用することをお勧めします。私のテストでは、SortedListはルックアップとキーによるインデックス作成で最大2倍高速になる傾向がありましたが、SortedDictionaryはエントリの削除で最大100倍高速でした。

于 2012-06-12T15:46:17.613 に答える