在字符串值字典中有效搜索?

时间:2014-03-28 18:52:48

标签: c#

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

现在我有一个搜索字符串,我需要在字典中查找搜索字符串是“string”value.i的所有条目。我说我有,

Dictionary<PersonId, PersonDescription> values;

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

如何以最快的方式搜索?

2 个答案:

答案 0 :(得分:2)

字典通过进行优化。因此,您将不得不迭代每个元素以查看该值是否包含密钥。这有两种可能的方式:

<强>迭代

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,但它闻起来像它。或者,您可能实际上需要通过键和搜索所有项目来访问字典

答案 1 :(得分:1)

string searchTerm = "office";
var PeopleIDs = dict.Where(person => person.Value.Contains(searchTerm))
                    .Select(item => item.Key);

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