我在C#字典中有一个预先计算出类型值的字典。
现在我有一个搜索字符串,我需要在字典中查找搜索字符串是“string”value.i的所有条目。我说我有,
Dictionary<PersonId, PersonDescription> values;
搜索字符串是“office”我需要在字典中查找PersonDescription字符串值包含术语“office”的所有条目。
如何以最快的方式搜索?
答案 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类(然后重复)
你必须从中派生一个类(但这很简单)(也假设PersonId
是PersonDescription
的成员:
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);
你想要比这更复杂的东西吗?