使用containsValue()时C#Dictionary运行缓慢

时间:2013-06-06 14:28:58

标签: c# dictionary foreach

我有一个包含通过读取二进制文件生成的自定义对象的HashSet。我还有一个通过读取DBF文件的每一行生成的字典。两者之间都有一个索引属性。例如,我的词典中的第10个项目将与我的HashSet中的第10个项目对齐。

我正在将大量数据相互比较。可以有10,000个记录到500,000个记录。应用程序检查其他两个文件(一个二进制文件,另一个是dbf)以查找差异。它检查对象的哈希码(由某些属性生成,它可以快速简便地进行比较)

以下是我如何构建每个单独的词典(也有类似的mod):

foreach (DataRow row in origDbfFile.datatable.Rows)
{
    string str = "";
    foreach (String columnName in columnNames)
    {
        str += "~" + row.Field<Object>(columnName);
    }
    origDRdict.Add(d, str);
    d++;
}

两个文件之间的列将始终相同。但是我可以遇到两个不同列的不同文件。我基本上将所有数据输出到字符串中以进行字典查找。如果数据不同,我只想再次点击DBF文件。

这是我的数据库查找代码。这会发现差异,当它运行我的(!foundIt)if块的ELSE部分时,它真的很慢。如果我将其删除,则只需一分钟即可列出所有未找到的项目。

foreach (CustomClass customclass in origCustomClassList) {
    Boolean foundIt = false;
    if (modCustomClassList.Contains(customclass))
    {
        foundIt = true;
    }
    //at this point, an element has not been found
    if (!foundIt)
    {
        notFoundRecords.Add(customclass);

    } 
    //If I remove this entire else block, code runs fast.
    else //at this point an element has been found
    {
        //
        //check 'modified' dictionary array
        if (!(modDRdict.ContainsValue(origDRdict[i])))
        {
            //at this point, the coordinates are the same, 
            //however there are DB changes
            //this is where I would do a full check based on indexes 
            //to show changes. 
        }
    }

    i++; //since hashsets can't be indexed, we need to increment
}

我尝试了什么/其他想法

- 生成自定义对象的HashSet,自定义对象具有整数索引,字符串是列和值的长度

-Removing if(!(modDRdict.ContainsValue(origDRdict [i])))阻止代码显着加快。在两个440,000记录文件之间迭代删除记录的时间只需要一分钟。 字典查找需要永远!

- 我不认为foreach循环中的foreach循环导致过多的开销。如果我将它保留在代码中,但不进行查找,那么它仍然可以快速运行。

1 个答案:

答案 0 :(得分:3)

字典经过优化,可以按键查找,而不是按值查找。如果您需要按值查找,则表示您使用了错误的字典。您需要在值上构建HashSet以快速检查包含,或者在需要密钥时构建反向字典。