如何进行字典反向查找
我有一个类型的字典,对于特定情况,我需要进行反向查找。 所以例如假设我有这个条目
并且我传入
"ab"
然后我想返回"SomeString"
。 在我开始对字典中的每个条目进行foreach
循环之前,我想知道进行此反向查找的最有效方法是什么?
基本上,您可以使用LINQ
并获取此类的Key
,而无需反转任何内容:
var key = dictionary.FirstOrDefault(x => x.Value == "ab").Key;
如果你真的想要反转你的词典,你可以使用这样的扩展方法:
public static Dictionary Reverse(this IDictionary source) { var dictionary = new Dictionary(); foreach (var entry in source) { if(!dictionary.ContainsKey(entry.Value)) dictionary.Add(entry.Value, entry.Key); } return dictionary; }
然后你可以像这样使用它:
var reversedDictionary = dictionary.Reverse(); var key = reversedDictionary["ab"];
注意:如果您有重复值,则此方法将添加第一个 Value
并忽略其他Value
。
使用Linq ToDictionary
函数:
var reversed = d.ToDictionary(x => x.Value, x => x.Key);
您可以在下面看到它的工作原理,在Linqpad中进行了测试:
var d = new Dictionary(); d.Add(1,"one"); d.Add(2,"two"); d.Dump(); //prints it out in linq-pad var reversed = d.ToDictionary(x => x.Value, x => x.Key); reversed.Dump(); //prints it out in linq-pad
如何使用linq函数ToDictionary:
var reversedDictionary = dictionary.ToDictionary(x => x.Value, x => x.Key);
1)键是唯一的,值不是。 对于给定值,您有一组键。
2)按键查找是O(log n)
。 用foreach
或LINQ迭代是O(n)
。
所以,
选项A:使用LINQ迭代,每个请求花费O(n)
,没有额外的内存。
选项B:维护Dictionary
,每个请求花费O(log n)
,使用O(n)
附加内存。 (有两个子选项:在一系列查找之前构建此字典;始终保持它)