2009-07-02 8 views
1

現在、C#のディクショナリコンテナ(特にSortedDictionary)を使用するプログラムを開発中です。このコンテナは、私がランダムにアクセスしたいので、特定のケースを除いて私の目的のために非常にうまく機能します。具体的には、擬似乱数ジェネレータを使用してランダムな位置を生成しており、SortedDictionaryでその値にアクセスできる必要があります。これが起こる時点では、私は重要な価値を持っていません。.NETでのキー/値ペアの位置によるランダムアクセス

この問題を解決するリストに切り替える可能性はありますが、SortedDictionaryが非常にうまく動作するアルゴリズムの残りの部分で問題が発生します。どんな提案/解決策も高く評価されます。

私は現在のVisual Studio開発しています2005年

ありがとうございました。

答えて

2
public TValue GetRandomElement<TKey, TValue>(SortedDictionary<TKey, TValue> dict) 
    { 
     Random randGen = new Random(); 
     int randIndex = randGen.Next(dict.Values.Count); 
     int i = 0; 
     foreach (TValue value in dict.Values) 
     { 
      if (i++ == randIndex) 
       return value; 
     } 

     // this shouldn't happen unless I have a bug above or you are accessing the dictionary from multiple threads 
     return default(TValue); 
    } 

盲目的ValueCollectionを列挙世界で最も効率的なものではありません。しかし、それは仕事を終わらせる。シナリオでこの操作が頻繁に行われる場合は、辞書検索とランダムアクセスの両方に必要なパフォーマンス特性を持つハイブリッドデータ構造を検討する必要があります。

+0

彼はVS2005を使用しています。 LINQはありません。 –

+0

私の答えを書いた2005年についての質問は何も言いませんでした。しかし、ok - C#2.0の機能だけを使用するようにコードを編集しました。 –

0

ランダムなキーを引き出すのですか?

var randValue = myDictionary.Values.ToList()[myRandomInt]; 

編集:

あなたは[]演算子を使用することはできませんので、キーの収集と値のコレクションは両方IEnumerablesているようです。これはそれが得られる最高のものです。

編集:

のLINQなし

...おそらく高価な、しかし、あなたは、配列をCopyToの、その後、あなたがSortedListのを使用することができます

System.Collections.Generic.KeyValuePair<string, int>[] dictCopy = new System.Collections.Generic.KeyValuePair<string, int>[myDictionary.Count]; 
myDictionary.CopyTo(dictCopy, 0); 
var randValue = dictCopy[myRandomInt].Value; 
+0

これはうまくいくと思いますが、AllKeysは利用できません。さもなければ、これは完全である。 – JasCav

+0

が編集されました。コレクションはキーと呼ばれます。 – Joel

4

インデックスの値を引き、それが値を持っている可能性があり整数インデックスを使ってアクセスできるコレクションです。

+0

この1つの部分でランダムアクセスが必要な頻度を考えると、リストの使用に切り替えることができます。この提案をありがとう。 – JasCav

1

LINQのはあなたのためにこれを行うことができます:

int n = GetRandomIndex(); 
object item = dictionary.ElementAt(n).Value; 
+1

高価ですね。 – arbiter

+0

+1、これはSortedDictionary の場合と同じくらい良いです。 – LukeH

+0

彼はVS2005を使用しているので、LINQはオプションではありません。 – Colin

0

解決策を提示するのに十分な情報を提供していません。どのくらいの要素を、どのくらいの頻度でこれを行うつもりですか、メモリ/スピードの制約がありますか? BTree、SortedList、SortedDictionary内の特別なノードを挿入するとすべて役に立ちます

関連する問題