Словари не работают так, как и не предназначены. Как бы вы решили следующее:
key = "1", value = "x",
key = "2", value = "x"
Вы можете сделать это:
var keys = dict.Where(kvp => kvp.Value == someValue).Select(kvp => kvp.Key);
foreach(var key in keys) {
Console.WriteLine(key);
}
Но если вам действительно нужно переключаться между ключами и значениями, вам следует рассмотреть возможность инкапсуляции проблемы в двустороннюю карту. Вот очень простая реализация, которую вы можете адаптировать к вашим потребностям:
class TwoWayDictionary<TLeft, TRight> {
IDictionary<TLeft, TRight> leftToRight = new Dictionary<TLeft, TRight>();
IDictionary<TRight, TLeft> rightToLeft = new Dictionary<TRight, TLeft>();
public void Add(TLeft left, TRight right) {
if (leftToRight.ContainsKey(left)) {
throw new InvalidOperationException("key left is duplicate");
}
if (rightToLeft.ContainsKey(right)) {
throw new InvalidOperationException("key right is duplicate");
}
leftToRight.Add(left, right);
rightToLeft.Add(right, left);
}
public bool TryGetRightByLeft(TLeft left, out TRight right) {
return leftToRight.TryGetValue(left, out right);
}
public bool TryGetLeftByRight(out TLeft left, TRight right) {
return rightToLeft.TryGetValue(right, out left);
}
}
Обратите внимание, что это предполагает, что ни один ключ никогда не дублируется.
Теперь вы можете сказать:
TwoWayDictionary<string, string> dict = new TwoWayDictionary<string, string>();
dict.Add("127.0.0.1", "localhost");
string host;
dict.TryGetRightByLeft("127.0.0.1", out host);
// host is "localhost"
string ip;
dict.TryGetLeftByRight("localhost", out ip);
// ip is "127.0.0.1"