我有一个应用程序,可以加载格式为key:value
的文件,然后将其添加到Dictionary
。这适用于小文件,但是当我尝试加载具有65,000行的文件时,它将无效并在Index was outside the bounds of the array.
上抛出Dictionary.TryAdd()
。
我为64位架构编译了我的应用程序,并在<gcAllowVeryLargeObjects enabled="true" />
中设置了app.config
。
private void LoadFile()
{
ConcurrentDictionary<string, string> Dict = new ConcurrentDictionary<string, string>();
OpenFileDialog dlgFile = new OpenFileDialog();
dlgFile.Filter = "All Files (*.*)|*.*";
dlgFile.FilterIndex = 1;
if (dlgFile.ShowDialog() == DialogResult.OK)
{
foreach (string line in File.ReadLines(dlgFile.FileName))
{
// Index was outside the bounds of the array.
Dict.TryAdd(line.Split(':')[0], line.Split(':')[1]);
}
}
}
答案 0 :(得分:0)
请尝试将foreach主体修改为以下代码段:
(?:(?:\'?(?:\[(?<wbook>.+)\])?(?<sheet>.+?)\'?!)?(?<colabs>\$)?(?<col>[a-zA-Z]+)(?<rowabs>\$)?(?<row>\d+)(?::(?<col2abs>\$)?(?<col2>[a-zA-Z]+)(?<row2abs>\$)?(?<row2>\d+))?|(?<name>[A-Za-z]+[A-Za-z\d]*))
删除空条目不是必需的,但它确保您不会将空键或值添加到字典中。我还建议确保字典不包含相同的密钥。
答案 1 :(得分:0)
这几乎可以肯定,因为您的某条行不包含:
,因此对生成的split string
数组的索引将失败,因为它没有2个部分
你可以跳过没有两个部分的行:
foreach (string line in File.ReadLines(dlgFile.FileName))
{
var parts = line.Split(':');
if (parts.Length == 2)
{
var key = parts[0];
var value = parts[1];
Dict.TryAdd(key, value);
}
else
{
// log that line was ignored
}
}
除此之外,除非您具有并发访问权限,否则无需使用ConcurrentDictionary
。您的应用程序中可能还有其他地方,但您所显示的代码中没有。