gpt4 book ai didi

c# - 使用 ContainsValue() 时字典运行缓慢

转载 作者:行者123 更新时间:2023-11-30 16:17:33 24 4
gpt4 key购买 nike

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

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

这是我构建每个单独字典的方式(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 block 的 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]))) block 可以显着加快代码速度。在两个 440,000 条记录文件之间迭代删除记录的时间仅需一分钟。 字典查找要花很长时间!

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

最佳答案

字典被优化为按键查找,而不是按值查找。如果您需要按值查找,则说明您使用了错误的字典。您需要在您的值上构建 HashSet 以快速检查包含,或者在需要键时构建反向字典。

关于c# - 使用 ContainsValue() 时字典运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16964768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com