有没有办法使用密钥搜索以多种方式搜索字典?

时间:2011-10-14 20:51:50

标签: c# .net dictionary

基本上我有一个Dictionary<Guid, Movie> Movies集合并使用Guid搜索电影,这基本上就是movie.Guid。它工作得很好,但我也希望能够使用movie.Name搜索相同的字典而不循环遍历每个元素。

这是可能的,还是我必须为此创建另一个Dictionary<K, V>

8 个答案:

答案 0 :(得分:3)

只有两个词典,其中一个以guid为键,另一个以名称为键。

答案 1 :(得分:1)

如果您不想查看每个元素,则需要将其编入索引。这意味着要获得 O(1)

的另一个词典

答案 2 :(得分:1)

您可以使用Values属性进行搜索:

dictionary.Values.Where(movie => movie.Name == "Some Name")

您将失去基于密钥的查找效率,但它仍然有效。

答案 3 :(得分:1)

您无法使用该词典以相同的效率进行搜索。但您可以轻松地对字典的Values属性运行LINQ查询,该属性只是Movie值的集合。

var moviesIWant = From m in movieLookup.Values
                  Where m.Name == "Star Wars"
                  Select m

一些想法:

  • 当你找到答案时,你会拥有guids,除非他们也是电影的财产。
  • 对于一本小字典,这很好。对于大型和重复搜索,您应该考虑创建其他要搜索的其他值的词典。只有这样,你才能达到与原始字典相当的guid查找速度。

您可以创建另一个由Name键入的字典。一旦你完成了这个,你可以通过它的密钥搜索这个字典,它将具有与原始字典相同的超高效率,即使是非常大的字典。

var moviesByName = movieLookup.Values.ToDictionary(m => m.Name, m => m)

答案 4 :(得分:1)

你可以迭代变量但是你在字典中获取常量时间搜索值(因为密钥被散列的方式。)上面关于使用两个dictionarys来散列对象的引用的答案可能是如果没有太多的对象可供参考,这是一个很好的解决方案。

答案 5 :(得分:1)

由于词典用于one-way映射,因此无法从值中获取键。

你需要两本词典。

还有一个建议: 您可以为键而不是GUID使用自定义哈希函数,并将Movie Names哈希存储为键。然后,您可以在字典中实际执行双向搜索。

答案 6 :(得分:1)

使用一个内部有两个字典的容器类,你最好不要使用两个字典。

一些名叫Jon的人想出了一个部分解决方案(你可以很容易地构建),将他的代码留在这里:Getting key of value of a generic Dictionary?

答案 7 :(得分:0)

不,我不相信这是可能的。你将不得不使用另一本字典。

如果您想要搜索更多电影属性,最好将数据移至数据库并使用该数据进行查询。这毕竟是数据库的好处。