如何进行字典反向查找

我有一个类型的字典,对于特定情况,我需要进行反向查找。 所以例如假设我有这个条目并且我传入"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)附加内存。 (有两个子选项:在一系列查找之前构建此字典;始终保持它)