我宣佈字典obj。如何從C#中的TKey獲取字典TValue?
Dictionary<string, string> aDict = new Dictionary<string, string>();
aDict .Add("IP", "Host");
正如我想起,
的aDict[IP]
表達可以返回該值(主機)。
現在,如果我走向相反的方向。
如何從價值中獲得鑰匙? aDict[Host]
?
字典是C#中的單向街道,只能從關鍵值運行?謝謝。
我宣佈字典obj。如何從C#中的TKey獲取字典TValue?
Dictionary<string, string> aDict = new Dictionary<string, string>();
aDict .Add("IP", "Host");
正如我想起,
的aDict[IP]
表達可以返回該值(主機)。
現在,如果我走向相反的方向。
如何從價值中獲得鑰匙? aDict[Host]
?
字典是C#中的單向街道,只能從關鍵值運行?謝謝。
詞典不會像這樣工作,他們也不打算這樣做。你將如何解決以下:
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"
字典是單向查找。如果需要,仍然可以循環查找「主機」值的詞典中的所有條目。如果您預計會做很多事情,您可能只想使用兩個字典並保持它們同步。
這是一條單行道。值不應該是唯一的,所以你不能按值查找的關鍵,除了通過枚舉整個詞典:
foreach(string s in Dict.Keys)
{
if(Dict[s] == TheValue)
;//we found it!
}
是的,字典基本上是單向的。例如,許多密鑰有可能具有「主機」的值,所以沒有簡單的反向查找。
但是,您可以遍歷字典注意哪些鍵映射到所需的值:
foreach (var entry in dict)
{
if (entry.Value == desiredValue)
found.Add(entry.Key);
}
顯然,這不是有效的爲大型辭書雖然。
這真的很酷。 – 2010-01-06 04:12:38