以最快的方式基于字典过滤列表

时间:2018-10-09 04:09:19

标签: c# performance dictionary filter hashset

我对基于字典的列表过滤操作的性能感到困惑,并且需要帮助来确定执行此操作的最快方法。

我有一个字符串列表(也尝试过Hashset和Dictionary),在这种情况下,我需要根据其他数据结构Dictionary的值过滤掉这些字符串。我需要不在词典中的所有值。列表数在300000附近,字典数在200000。当我使用以下代码时,这要花费很多时间。请提供您的意见,我将如何改进此操作。

Dictionary<string, string> dictLocalFile - this has around 200000 entries.

var finalFilesHashSet = 
    new HashSet<string>(
        FinalFilesList
       .Where(x => !dictLocalFile.Any(kvp => kvp.Key.Equals(Path.GetFileName(x)))));

1 个答案:

答案 0 :(得分:1)

您没有有效地使用字典。您要检查字典是否不包含键。更改您的代码以使用.ContainsKey方法。另外,您可能应该提前从该循环中调用Path.GetFileName(x)并衡量其影响。

var finalFilesHashSet = new HashSet<string>(
    FinalFilesList.Where(x => !dictLocalFile.ContainsKey(Path.GetFileName(x))));

使用字典代码编写的代码基本上消除了所有性能优势,字典为您提供:O(1)获取操作。相反,您将其转换为可枚举并通过字典内容进行迭代。内置方法本质上是哈希表查找