簡體   English   中英

如何在C#中從TKey獲取字典TValue?

[英]How to Get Dictionary TValue from TKey in C#?

我宣布了字典obj。

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

我記得,

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

現在,如果我走向相反的方向。

如何從價值中獲取關鍵? aDict[Host]

字典是否是C#中的單行道,只能從Key運行到Value? 謝謝。

字典不是這樣工作的,它們也不打算這樣做。 您將如何解決以下問題:

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"

字典是單向查找。 如果需要,您仍然可以遍歷Dictionary中的所有條目,查找值“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);
}

顯然,這對大詞典來說效率不高。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM