【问题标题】:Do a search efficiently across a dictionary of string values?在字符串值的字典中有效地进行搜索?
【发布时间】:2014-05-08 09:26:16
【问题描述】:

我有一个 C# 字典中预先计算的类型值的大型字典。

现在我有一个搜索字符串,我需要在字典中找到搜索字符串是“字符串”值的一部分的所有条目。也就是说,我有,

Dictionary<PersonId, PersonDescription> values;

搜索字符串是“office”,我需要在字典中查找 PersonDescription 字符串值包含术语“office”的所有条目。

如何以最快的方式进行最佳搜索?

【问题讨论】:

标签: c#


【解决方案1】:
string searchTerm = "office";
var PeopleIDs = dict.Where(person => person.Value.Contains(searchTerm))
                    .Select(item => item.Key);

你想要比这更复杂的东西吗?

【讨论】:

    【解决方案2】:

    字典在通过 key 访问时进行了优化。因此,无论如何,您将不得不遍历每个元素以查看该值是否包含键。以下是两种可能的方式:

    迭代

    List<PersonDescription> found = new List<PersonDescription>();
    foreach(var pair in values)
    {
       if(pair.Value.SomeField.Contains("office"))
           found.Add(pair.Value);
    }
    

    请注意,上面添加了PersonDescription,您可能要添加PersonId

    使用KeyedCollection 类(然后迭代)

    您必须从中派生一个类(但这很简单)(还假设PersonIdPersonDescription 的成员:

    using System.Collections.Generic.ObjectModel
    
    public class PersonDictionary : KeyedCollection<int, PersonDescription>
    {
        protected override int GetKeyforItem(PersonDescription description)
        {
            return description.Personid; // hope it's on this class!
        }
    } 
    

    现在您可以对其进行迭代,也可以随机访问它:

    List<PersonDescription> found = new List<PersonDescription>();
    for(int i = 0; i < values.Count; ++i)
    {
        if(values[i].Field.Contains("office"))
            found.Add(values[i]);
    }
    

    如果您愿意,可以将上面指定的手动循环替换为 LINQ。

    通常使用字典是因为您希望通过 快速查找。我不是说这是XY Problem,但它闻起来像。或者,您实际上可能需要通过键和搜索所有项目来访问字典

    【讨论】:

    • 嗨 Moo-Juice...您可能是对的...这是漫长的一天。基本上,我在 csv 文件中有一个很长的 PersonId、PersonDesc 字符串值列表,我需要对文件中与作为 PersonDesc 的一部分的搜索字符串匹配的项目执行某种快速搜索,理想情况下,我需要一个我相信的索引但作为第一遍,我认为 Id 使用字典来加载值。
    • (除非我弄错了)这些都不会比遍历List&lt;&gt; 更快地进行部分字符串匹配(例如Field.Contains("office") 而不是Field == "office")。 Dictionary 及其基于哈希的兄弟非常适合 exact 匹配,而不是 inexact 匹配。也许您可以在较长的不精确搜索之前使用适当的字典/查找进行快速精确搜索...
    • @TimS.,我假设 一般他想使用 id 访问,但也想执行搜索。我相信KeyedCollection 在这里可能会有所帮助,但你是对的——我怀疑它与List&lt;&gt; 有什么不同。但是,我面前没有他所有的用例:)
    • 谢谢@TimS。关于我可以使用的任何其他数据结构的任何建议......我更喜欢现成的 C# .Net 4.0 的一部分
    • 我一定会调查那个@TimS。这实际上看起来像我应该看的东西。谢谢大家的建议。我会将此标记为答案...再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-04-19
    • 2020-06-01
    • 1970-01-01
    • 2020-12-21
    • 2013-07-24
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多