如何在C#中从TKey获取字典TValue?

如何在C#中从TKey获取字典TValue?,c#,.net,dictionary,two-way,C#,.net,Dictionary,Two Way,我宣布词典为obj Dictionary<string, string> aDict = new Dictionary<string, string>(); aDict .Add("IP", "Host"); Dictionary aDict=newdictionary(); 补充:添加(“IP”、“主机”); 我记得 aDict[IP]的表达式可以返回值(主机) 现在如果我朝相反的方向走 如何从值中获取密钥再见[主机] 字典在C#中是单向的,只从

我宣布词典为obj

Dictionary<string, string> aDict = new Dictionary<string, string>(); 
        aDict .Add("IP", "Host"); 
Dictionary aDict=newdictionary();
补充:添加(“IP”、“主机”);
我记得

aDict[IP]
的表达式可以返回值(主机)

现在如果我朝相反的方向走

如何从值中获取密钥<代码>再见[主机]


字典在C#中是单向的,只从键到值运行吗?谢谢。

字典是单向查找。如果需要,您仍然可以在字典中的所有条目上循环查找值“Host”。如果你希望经常这样做,你可能只想使用两个字典来保持它们的同步。

这是一条单行道。值不应是唯一的,因此不能按值查找键,除非枚举整个字典:

 foreach(string s in Dict.Keys)
 {
   if(Dict[s] == TheValue)
       ;//we found it!
 }

是的,字典基本上是单行道。例如,许多键可能具有值“Host”,因此不存在简单的反向查找

但是,您可以迭代字典,注意哪些键映射到所需的值:

foreach (var entry in dict)
{
  if (entry.Value == desiredValue)
    found.Add(entry.Key);
}

显然,这对于大型词典来说并不有效。

词典不是这样工作的,也不打算这样做。您将如何解决以下问题:

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);
    }
}
类双向字典{
IDictionary leftToRight=新字典();
IDictionary rightToLeft=新字典();
公共空白添加(左左三,右三){
if(左到右。ContainsKey(左)){
抛出新的InvalidOperationException(“左键重复”);
}
if(右至左集装箱箱(右)){
抛出新的InvalidOperationException(“密钥权限重复”);
}
leftToRight.Add(左、右);
从右到左添加(右、左);
}
公共布尔TryGetRightByLeft(左左三,右三){
返回leftToRight.TryGetValue(左,右外);
}
公共布尔tryGetLeftBylight(左外,右外){
返回rightToLeft.TryGetValue(右,左外);
}
}
请注意,这假设没有任何键被复制

现在你可以说:

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"
TwoWayDictionary dict=newtwowaydictionary();
dict.Add(“127.0.0.1”,“本地主机”);
字符串主机;
dict.TryGetRightByLeft(“127.0.0.1”,主机外);
//主机是“localhost”
字符串ip;
dict.tryGetLeftBylight(“本地主机”,输出ip);
//ip为“127.0.0.1”