我声明了字典 obj。
Dictionary<string, string> aDict = new Dictionary<string, string>();
aDict .Add("IP", "Host");
我记得,
的表达式aDict[IP]可以返回值(主机)。
现在,如果我朝相反的方向走。
如何从 Value 中获取 Key?aDict[Host]?
Dictionary 是否是 C# 中的一条单行道,仅从 Key 到 Value 运行?谢谢。
我声明了字典 obj。
Dictionary<string, string> aDict = new Dictionary<string, string>();
aDict .Add("IP", "Host");
我记得,
的表达式aDict[IP]可以返回值(主机)。
现在,如果我朝相反的方向走。
如何从 Value 中获取 Key?aDict[Host]?
Dictionary 是否是 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);
}
显然,这对于大型词典来说效率不高。