【问题标题】:Read dictionary object values using for loop or linq or any other approach in a faster way使用 for 循环或 linq 或任何其他方法以更快的方式读取字典对象值
【发布时间】:2019-10-02 12:50:26
【问题描述】:

我有一个字典对象,它有一个键和一个值列表(几乎 400,000 个值),我想遍历值列表并搜索所需的值,如果匹配,则需要提取该值。

我尝试使用以下方法搜索值

  1. for 循环
  2. 林克

但我可以使用 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&lt;T&gt; 实例)改成HashSet&lt;T&gt; 吗?
  • Linq 版本应该使用FirstOrDefault 而不是Where,所以它会在找到匹配项时停止。
  • @Maarten 这无济于事,因为看起来他们正在进行子字符串比较。我当然假设Valuestring 而不是另一个子列表。
  • 您还应该只检索一次 consumer 的键值对,因此在循环之前,请执行 var list = dictionaryObj[consumer]; 并从那里使用该实例。
  • 如果您需要快速的子字符串匹配,那么您将不得不查看像 Trie 这样的结构。它们增加了空间,填充它们需要更长的时间,但搜索速度更快。

标签: c# dictionary for-loop


【解决方案1】:

如果您多次重复此搜索,则最好使用HashSet&lt;T&gt; 而不是List&lt;T&gt;。哈希集可以让您在几乎零时间内搜索项目。

而且这个问题和你使用字典无关,而是里面使用的结构。

一般来说,如果您要多次重复相同的动作并希望每次运行都非常快,那么值得花时间预先构建一个快速使用的结构,但可能需要几秒钟来设置.在您的情况下,您可以创建一个快速查找结构来快速检查字典中的值是否包含特定键。并且使用该查找结构不需要遍历所有项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多