2009-05-15 5 views
2

私は、キー値のペアを格納するためにStringDictionaryを使用しています。私はキーと値を同じ意味で使用する必要があります。つまり、私の場合のように値からキーを取得できるはずです。.Netコレクションの値からキーを取得する

私はそれを行うことができる直接の方法はありますか(ループなし)ですか?あるいは、これを達成するために使うことができる他のコレクションがあれば?

現在、私はループしています:

public String GetKeyFromValue(string value) 
     { 
      foreach (KeyValuePair<string, string> kvp in instance) 
      { 
       if (String.Equals(kvp.Value, value)) 
        return kvp.Key; 
      } 

      throw new Exception ("Key not found in FilterControlMapping"); 
     } 

すべてのヘルプははるかに高く評価されます。おかげさまで

+0

タグが変更されました。それはasp.netに固有なものではありません。 –

+0

[重複する辞書の価値のキーを取得しますか?](http://stackoverflow.com/questions/255341/getting-key-of- generic-value-of-generic-dictionary) – nawfal

答えて

2

私が考えることができる唯一の方法は2つの辞書です。

D1 <キー、キー値> D2 <値、>

あなたはしかし、あなたのデータを繰り返すことになります。しかし、この方法でキーと値の両方を検索できます。

0

また、これは、辞書を使用することで可能になります:値が複数回発生した場合、単一のメソッドがスローすることを

Dictionary<string, string> sd = new Dictionary<string, string>(); 
string sKey = sd.Single(kvp => kvp.Value.Equals("A value")).Key; 

注意。 FirstやFirstOrDefaultを使用することもできます。

編集: Jon Skeet氏はこれがまだループしているとコメントしています。リンク先辞書に投稿したリンクが解決策を提供します。

+0

これは*効果的なループです。つまり、複雑さは望ましいO(1)ではなくO(n)です。 –

+0

2.0で=>演算子を使用できますか? –

+0

いいえ、ラムダ式は使用できません。 2.0で同じことを達成する方法については、http://stackoverflow.com/questions/556425/predicate-delegates-in-cを参照してください。 Jon Skeetのコメントには注意してください。これはまだループします! – Onots

5

基本的に2つの辞書を1つにカプセル化する必要があります。

他のスタックオーバーフローの質問にはすでにherehereの実装があります。

+0

それは二重記憶を意味するでしょうか? –

+0

何のメモリ、正確に?各コレクションには実際の値が参照されるだけなので、実際のオブジェクト*は一度(参照型について話していると仮定して)一度しか持てません。はい、帳簿管理などに必要なスペースは2倍になりますが、それは両方の方法を調べることができるために支払う価格です。 –

0

最高のアイデアは、そのobseleteとして代わりにStringDictionaryの辞書を使用することです。.. あなたはここで、このについての詳細を調べることができます:あなたは内部的にループを使用しているLINQで行くが、まだそのくらいきれいな方法べきでretrivalに関する StringDictionary vs Dictionary<string, string> ..

+0

情報をくれてありがとう。私はDictionary からStringDictionaryに実際に移行しました。後ろに戻る時間: –

+0

あなたは歓迎です:) –

関連する問題