基本上我有一个Dictionary<Guid, Movie> Movies
集合并使用Guid搜索电影,这基本上就是movie.Guid。它工作得很好,但我也希望能够使用movie.Name
搜索相同的字典而不循环遍历每个元素。
这是可能的,还是我必须为此创建另一个Dictionary<K, V>
?
答案 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
一些想法:
您可以创建另一个由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)
不,我不相信这是可能的。你将不得不使用另一本字典。
如果您想要搜索更多电影属性,最好将数据移至数据库并使用该数据进行查询。这毕竟是数据库的好处。