【发布时间】:2019-10-02 12:50:26
【问题描述】:
我有一个字典对象,它有一个键和一个值列表(几乎 400,000 个值),我想遍历值列表并搜索所需的值,如果匹配,则需要提取该值。
我尝试使用以下方法搜索值
- for 循环
- 林克
但我可以使用 for 循环在 800 毫秒内搜索和提取值,而使用 linq 提取值需要 4 秒。
使用 for 循环
for (int i = 0; i < dictionaryObj[consumer].Count; i++)
{
if (dictionaryObj[consumer][i].Value.Contains("XYZ value")
{
personTag = dictionaryObj[consumer][i];
break;
}
}
使用 linq
var matchedValue = dictionaryObj[consumer]
.Where(x => x.Value.Contains(input));
Console.WriteLine(matchedValue.ToArray()[0]); (or)
Console.WriteLine(matchedValue.First());
能够使用 for 循环在一秒内搜索和提取单个值,但需要在一毫秒内搜索和提取单个值,以便我可以更快地处理 400,000 条记录。
【问题讨论】:
-
你能把列表(我假设是
List<T>实例)改成HashSet<T>吗? -
Linq 版本应该使用
FirstOrDefault而不是Where,所以它会在找到匹配项时停止。 -
@Maarten 这无济于事,因为看起来他们正在进行子字符串比较。我当然假设
Value是string而不是另一个子列表。 -
您还应该只检索一次
consumer的键值对,因此在循环之前,请执行var list = dictionaryObj[consumer];并从那里使用该实例。 -
如果您需要快速的子字符串匹配,那么您将不得不查看像 Trie 这样的结构。它们增加了空间,填充它们需要更长的时间,但搜索速度更快。
标签: c# dictionary for-loop