C# 有没有一种方法可以使用关键字搜索以多种方式搜索词典?

C# 有没有一种方法可以使用关键字搜索以多种方式搜索词典?,c#,.net,dictionary,C#,.net,Dictionary,基本上,我有一个电影字典收集并使用Guid搜索电影,基本上是movie.Guid。它工作得很好,但我也希望能够使用movie.Name搜索同一个字典,而不必遍历每个元素 这是可能的,还是我必须为此创建另一个字典?只有两个字典,其中一个以guid为键,另一个以名称为键。如果不想查看每个元素,需要将其索引到另一个方向。这意味着要获得另一个字典O(1),您可以使用Values属性进行搜索: dictionary.Values.Where(movie => movie.Name == "Some

基本上,我有一个
电影字典
收集并使用Guid搜索电影,基本上是movie.Guid。它工作得很好,但我也希望能够使用
movie.Name
搜索同一个字典,而不必遍历每个元素


这是可能的,还是我必须为此创建另一个
字典?

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

如果不想查看每个元素,需要将其索引到另一个方向。这意味着要获得另一个字典O(1)

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

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

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

不,我认为这是不可能的。你得用另一本字典

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

如果要搜索更多电影属性,最好将数据向下移动到数据库中,并使用该数据库进行查询。毕竟,这就是数据库的优势所在。

你不能用这本字典以同样的效率进行搜索。但您可以轻松地对字典的
属性运行LINQ查询,该属性只是电影值的集合

var moviesIWant = From m in movieLookup.Values
                  Where m.Name == "Star Wars"
                  Select m
一些想法:

  • 当你找到你的答案时,你不会拥有guid,除非它们也是电影的财产
  • 对于一本小词典来说,这很好。对于大型和重复的搜索,你应该考虑创建其他字典,键入你希望搜索的其他值。只有这样,您才能实现与原始词典相当的guid查找速度
您可以创建另一个按名称键入的词典。一旦你做到了这一点,你就可以通过它的键来搜索这本字典,它将具有与原始字典相同的超级效率,即使是对于一本非常大的字典

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

您可以遍历变量,但无法在字典中获得恒定时间搜索值(因为键是散列的)上面关于使用两个字典对对象的引用进行散列的答案可能是一个很好的解决方案,如果您没有太多的对象可供引用。

因为字典用于单向映射,所以无法从值中获取键

你需要两本字典

还有一项建议:
您可以对键使用自定义哈希函数而不是guid,并将
电影名称
哈希存储为键。然后可以在字典中执行双向搜索。

与其使用两个字典,不如使用一个容器类,其中包含两个字典

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

有个叫Jon的家伙想出了一个部分解决方案(你可以很容易地构建它),把他的代码留在这里:

你希望将来搜索其他字段吗?如果你从数据库中填充字典,你会更好地在数据库查询中过滤。你会做精确的名称匹配吗,或者您希望能够搜索部分名称匹配吗?似乎不太可能有人会去搜索“终结者3:机器的崛起”。另外,为什么要使用GUID作为唯一标识符,而不是通用产品代码或其他专门用于介质的标准标识符?为什么要关心Mem的性能。数据?你有多少入场券?100米?1G?@琼有点像。查找-它似乎(我不是一个C#家伙,我是一个Java家伙)在一个轻量级数据库中拥有所有你要查找的东西。谢谢,你说的索引是什么意思?为了得到O(N)中的查找,你需要一个“索引”,在本例中是用字典完成的。“在另一个方向”这句话是一个糟糕的描述方式。谢谢,是的,我现在就是这样做的,但我想要O(1):OThanks,但这只能通过提供
Guid
电影来工作,对吗?不是
Guid
Name
,而是非常有趣的想法。啊,我明白了。我以为您想通过
Guid
Movie
进行搜索。在这种情况下,不完全是这样,但我仍然会应用相同的原则:在容器类中使用它们,并在其中封装您的逻辑。谢谢,这是一个有趣的想法,我可能会实现,但
BiDictionary
无论如何都很酷。谢谢,在我的例子中,
Movie
类型有
Guid
值,所以我仍然可以从那里访问它。确切地说,你可以在你想要搜索的每一列上都有一个索引,这会给你带来二进制搜索性能。谢谢,这是一个有趣的想法。如何实现字符串的哈希?使用string.GetHashCode()?我会使用加密MD5哈希类,并使用
string.ToBase64()
Text.Encoding.GetBytes()
方法进行字节字符串转换。谢谢,这看起来很酷。使用这些会有性能开销吗?我不这么认为,当你想按名称搜索一个键时,你只需要计算它的哈希值一次,然后在字典中找到那个哈希值。对于要添加的每个项目,应该计算电影名称哈希。