使用containsValue()时,C#词典运行缓慢

我有一个HashSet,其中包含通过读取二进制文件生成的自定义对象.我还具有通过读取DBF文件的每一行而生成的字典.两者之间都有一个index属性.例如,我的词典中的第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,自定义对象的索引为整数,字符串为列和值的长度

-删除if(!(modDRdict.ContainsValue(origDRdict [i])))块可使代码明显更快.在两个440,000个记录文件之间迭代已删除记录的时间仅需一分钟.字典查找将永远进行!

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

解决方法:

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

上一篇:python-从文本文件创建字典


下一篇:C#-保持我的列表/词典可全局访问