C# 使用for循环或linq或任何其他方法以更快的方式读取字典对象值

C# 使用for循环或linq或任何其他方法以更快的方式读取字典对象值,c#,dictionary,for-loop,C#,Dictionary,For Loop,我有一个dictionary对象,它有一个键和一个值列表(大约400000个值),我想查看值列表并搜索所需的值,如果它匹配,那么我需要提取值 我尝试使用以下方法搜索值 For循环 林克 但我能够在800毫秒内使用for循环搜索和提取值,使用linq提取值需要4秒 用于循环 for (int i = 0; i < dictionaryObj[consumer].Count; i++) { if (dictionaryObj[consumer][i].Value.Contains("X

我有一个dictionary对象,它有一个键和一个值列表(大约400000个值),我想查看值列表并搜索所需的值,如果它匹配,那么我需要提取值

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

  • For循环
  • 林克
  • 但我能够在800毫秒内使用for循环搜索和提取值,使用linq提取值需要4秒

    用于循环

    for (int i = 0; i < dictionaryObj[consumer].Count; i++)
    {
        if (dictionaryObj[consumer][i].Value.Contains("XYZ value")
        {
            personTag = dictionaryObj[consumer][i];
            break;
        }
    }
    

    使用for循环可以在一秒钟内搜索和提取单个值,但需要在一毫秒内搜索和提取单个值,这样我可以更快地处理400000条记录。

    如果要多次重复此搜索,则最好使用
    HashSet
    而不是
    List
    。散列集允许您在几乎零时间内搜索项目

    这个问题与你对字典的使用无关,但它内部使用的结构


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

    您可以更改列表吗(我假设一个
    list
    实例)进入
    哈希集
    ?Linq版本应该使用
    FirstOrDefault
    而不是
    Where
    ,这样当它找到匹配项时就会停止。@Maarten这不会有帮助,因为看起来它们正在进行子字符串比较。当然,我假设
    是一个
    字符串
    ,而不是另一个子列表。您还应该只检索
    使用者
    的键值对一次,因此在循环之前,执行
    var list=dictionaryObj[consumer]并从此处开始使用该实例。如果需要快速的子字符串匹配,则必须像。它们增加了空间,填充时间更长,但搜索速度更快。
    
    var matchedValue = dictionaryObj[consumer]
                       .Where(x => x.Value.Contains(input));
    Console.WriteLine(matchedValue.ToArray()[0]); (or)
    Console.WriteLine(matchedValue.First());