索引超出了Dictionary

时间:2016-05-01 08:58:16

标签: c# file dictionary

我有一个应用程序,可以加载格式为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]);
        }
    }
}

2 个答案:

答案 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。您的应用程序中可能还有其他地方,但您所显示的代码中没有。