辞書のキーと値を同時に取得する

C#でDictionaryのkey by valueを取得するには?

Dictionary<string, string> types = new Dictionary<string, string>()
{
            {"1", "one"},
            {"2", "two"},
            {"3", "three"}
};

以下のようなものが欲しいです。

getByValueKey(string value);

getByValueKey("one")は、"1"を返す必要があります。

これを行う最良の方法は何でしょうか?たぶんHashTableかSortedLists?

ソリューション

値は必ずしも一意である必要はないので、ルックアップを行う必要があります。次のようなことができます。

var myKey = types.FirstOrDefault(x => x.Value == "one").Key;

値が一意で、挿入頻度が読み取り頻度よりも低い場合は、値をキー、キーを値とする逆引き辞書を作成します。

解説 (13)

それができるんですね。

1.辞書内のすべてのKeyValuePair'をループさせる(辞書に多数のエントリがある場合は、かなりのパフォーマンスの低下を招く)。 2.2つの辞書を使用する。1つは値からキーへのマッピング用、もう1つはキーから値へのマッピング用である(これはメモリ上で2倍のスペースを取ることになる)。

パフォーマンスを考慮しない場合は方法1を使用し、メモリを考慮しない場合は方法2を使用します。

また、すべてのキーは一意でなければなりませんが、値は一意である必要はありません。 指定された値を持つキーが複数あっても構いません。

キーと値の関係を逆にしてはいけない理由はありますか?

解説 (2)

私はとてもシンプルな方法でこれを実現しました。私にとっては完璧にうまくいきました。

Dictionary types = new Dictionary();

types.Add("1", "one");
types.Add("2", "two");
types.Add("3", "three");

Console.WriteLine("Please type a key to show its value: ");
string rLine = Console.ReadLine();

if(types.ContainsKey(rLine))
{
    string value_For_Key = types[rLine];
    Console.WriteLine("Value for " + rLine + " is" + value_For_Key);
}
解説 (3)