C#列表索引数组超出范围

时间:2016-02-22 13:06:48

标签: c# arrays list

我制作了一个程序,从文件中提取一些信息,对其进行一些操作并将其存储回列表中。 点击此链接: Are 2 dimensional Lists possible in c#? 我已经能够创建一个符合我需求的列表。但经过一些调试后,我发现我在每次循环迭代时都覆盖了列表。 然后我决定制作一系列列表 - 按照以下链接: How to create an array of List<int> in C#?

创建一个列表数组,初始化它并添加元素。但是当它需要移动到下一个列表位置时,它会抛出超出边界的异常。

我尝试了一些事情(关于竞争条件),但没有一个人工作过。 只有当我用我的代码打开多个文件时才会出现问题;否则它完美无缺。

在xmldata中,在当前文件的最后一次迭代中抛出异常。 例:选中两个文件,每个文件将添加五个元素。在第一个文件的最后一个元素中,将抛出异常,并在最后一个元素的位置添加数据。

其他信息:索引超出了数组的范围。 (抛出异常)。

任何帮助将不胜感激。非常感谢。

代码:

List<xmldata>[] finalcontent = new List<xmldata>[9999];
 finalcontent[listpos] = new List<xmldata>();//Initializing a list for each filename

                            foreach (Match m in matches)
                            {

                                Double[] numbers;
                                string aux;
                                aux = m.Groups[1].ToString();
                                aux = Regex.Replace(aux, @"\s+", "|");
                                string[] numbers_str = aux.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
                                numbers = new Double[numbers_str.Length];
                                for (int j = 0; j < numbers.Length; j++)
                                {
                                    numbers[j] = Double.Parse(numbers_str[j], CultureInfo.InvariantCulture);
                                    //Converts each number on the string to a Double number, store it in a position
                                    //in the Double array
                                    numbers[j] = numbers[j] / 100; //Needed calculus
                                    numbers[j] = Math.Round(numbers[j], 3); //Storing numbers rounded
                                }
                                string values = String.Join(" ", numbers.Select(f => f.ToString()));

                                if (i <= colors_str.Length)
                                {
                                    finalcontent[listpos].Add(new xmldata//The exception is thrown right here
                                    {
                                        colorname = colors_str[i],
                                        colorvalues = values,

                                    });//Closing list add declaration
                                 }//Closing if
                                i++;
                            }//Closing foreach loop

链接到文件:https://drive.google.com/file/d/0BwU9_GrFRYrTT0ZTS2dRMUhIWms/view?usp=sharing

4 个答案:

答案 0 :(得分:2)

数组是固定大小的,但列表会在添加新项目时自动调整大小。

相反,既然你正在使用列表,为什么不使用列表列表呢?

List<List<int>> ListOfListsOfInt = new List<List<int>>();

然后,如果你真的必须有一个数组,那么你可以得到一个这样的:

ListOfListsOfString.ToArray();

答案 1 :(得分:1)

// Convert non-ascii characters to .
for (int jx = 0; jx < cnt; ++jx)
if (line[jx] < 0x20 || line[jx] > 0x7f) line[jx] = (byte)'.';

这是一个很好的例子,但请检查一下。你增加&#39; jx&#39;在进入声明之前,可能超过了cnt的边界?

答案 2 :(得分:0)

使用列表时 - 最好使用本机函数。

List<xmldata>[] finalcontent = new List<xmldata>(); 
......
 finalcontent[listpos] = new List<xmldata>(); insted of   var _tmpVariable = new List<xmldata>();//Initializing a list for each filename
......
 _tmpVariable.Add(new xmldata
                                    {
                                        colorname = colors_str[i],
                                        colorvalues = values,

                                    });//Closing list add declaration

                    fs.Close();//closing current file
                    listpos++;//Increment list position counter
                    finalcontent.Add(_tmpVariable); // add list into list

由于没有异常细节,因此很难获得抛出异常的位置。 它可能是列表问题,字符串问题或其他(甚至文件读取问题), 因此,请使用当前的异常详细信息进行更新。

答案 3 :(得分:0)

尝试更改以下内容:

if (i <= colors_str.Length) 

if (i < colors_str.Length). 

事实上,我确信这就是问题所在。

这是因为引用从0开始,最后一个引用是length - 1,而不是length。