松散的字典,需要建议

时间:2009-12-07 10:23:43

标签: c# string dictionary

我需要创建一个dictinary,其中key是string,value是Object。 但我不希望密钥与用户提供的字符串完全匹配。相反,我想键入包含字符串的一部分。让我举例说明

如果在“约翰逊”键下的字典中有条目,我希望能够找到价值 给定输入字符串“John”,“Jo”。此外,我希望能够提取几个匹配的值 按给定条件输入字符串。例如,如果我想要条目“John A”和“John B” 使用像FindFirst这样的函数来将迭代器返回到第一个匹配的值。

理想情况下,我更喜欢使用现有的System.Collections.Generic.Dictionary 可能派生一个新类并重写一些方法

5 个答案:

答案 0 :(得分:3)

我怀疑SortedList<TKey, TValue>将是你最好的选择,这是一个基于二叉搜索树的字典。其Keys属性返回IList<TKey>,访问时间为O(1)。

您将获取Keys属性并执行二进制搜索以查找以搜索键开头的键。然后从该示例键向上和向下查找以找到实际匹配的键范围。这将提供O(log n)性能,而不是通过查看所有键获得的O(n)性能。

我不会从中派生 - 我会在内部写一个 a SortedList<,>的类型。

答案 1 :(得分:2)

虽然我怀疑字典是否适合这样的事情,但你可以使用:

dictionary[dictionary.Keys.First(d=>d.StartsWith("Jo"))]

你在这里失去了字典的大部分价值,因为它是通过使用密钥来快速检索值而优化的。在这种情况下,您将必须遍历列表中的每个键。

我必须+1 Jon才能指出SortedList<TKey,TValue>

答案 2 :(得分:1)

您可以通过提供IEqualityComparer的实现来使用与Dictionary的自定义相等比较。但是,Dictionary是一个哈希映射,需要从每个键到相同的整数哈希的映射,这使得它在您的情况下不太有用。您可以使用SortedDictionary(也是IDictionary),提供自定义IComparer并获得O(log(n))查找时间(而不是字典理想情况下可以提供的O(1))。

答案 3 :(得分:1)

您可以使用普通字典并提供自己的比较器,请查看generic dictionary,特别是有关providing your own comparer的部分。

主要问题是,在您找到匹配项之前,您必须与所有键进行比较,因为您使用的是自定义规则,因此如果无法匹配,请确保自定义比较器快速退出(例如,从另一封信)。

答案 4 :(得分:1)

我认为您应该考虑将对相应密钥的搜索与访问基础记录分开。

例如,你有一个btree +结构的单纯键,你找到第一个匹配的记录,然后你跟着btree +枚举器,直到你没有匹配。

类似于数据库中的非聚合索引。首先找到密钥,然后找到记录。

“Johnson”中的“Jo”和“John”示例是“StartsWith()”的示例,其中键排序将使您受益。如果您还希望仅查找子串而不是初始段,则需要查看存储和查找密钥的其他算法。

如果您不确定自己是否需要并且能够利用优化搜索,那么您应该只对所有键进行内存中扫描,然后专注于优化匹配谓词。 例如,通过使用预编译搜索的正则表达式选项。