Les dictionnaires ne fonctionnent pas comme ceux-ci et ne le sont pas non plus. Comment voulez-vous résoudre ce qui suit:
key = "1", value = "x",
key = "2", value = "x"
Vous pouvez le faire:
var keys = dict.Where(kvp => kvp.Value == someValue).Select(kvp => kvp.Key);
foreach(var key in keys) {
Console.WriteLine(key);
}
Mais si vous avez vraiment besoin d'aller et venir entre les touches et les valeurs que vous devriez envisager d'encapsuler le problème en deux carte de route Voici une application très simple de ce que vous pouvez adapter à vos besoins:
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);
}
}
Notez que cela suppose qu'aucune clé est jamais reproduit.
Maintenant vous pouvez dire:
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"
Il est vraiment cool. –