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

时间:2010-01-06 03:33:58

标签: c# .net dictionary two-way

我宣布了字典obj。

Dictionary<string, string> aDict = new Dictionary<string, string>(); 
        aDict .Add("IP", "Host"); 

我记得,

aDict[IP]的表达式可以返回值(Host)。

现在,如果我向相反的方向前进。

如何从价值中获取密钥? aDict[Host]

字典是否是C#中的单行道,只能从Key运行到Value?感谢。

4 个答案:

答案 0 :(得分:19)

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

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"

答案 1 :(得分:3)

Dictionary是一种单向查找。如果需要,您仍然可以遍历Dictionary中的所有条目,查找值“Host”。如果您预计会做很多事情,您可能只想使用两个词典并使它们保持同步。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

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

显然,这对于大型词典来说效率不高。