0

我创建了 2 个 foreach 循环,但出现错误(索引超出数组范围),因为我使用了 2 个数组。

这就是我所做的:

using (StreamReader reader = File.OpenText(@"C:\Users\apr13mpsip\Documents\Visual Studio 2010\Projects\iStellarMobile\iStellarMobile\Puzzle\educational.txt"))
{
    string line;

    while ((line = reader.ReadLine()) != null) // read line by line.
    {
        column = line.Split(new string[] { "," }, StringSplitOptions.None);
        rowcol = column;
    }

    int  i = 0;
    int  j = 0;

    foreach (string r in rowcol)
    {
        foreach (string c in column)
        {
            var currentValue = rowcol[i][j];
            j++;
        }
        i++;                    
    }
}

我已经有全局字符串 [] 列;和字符串 [] 行列;

此行发生错误:

var currentValue = rowcol[i][j];

- - - -编辑 - - - - - - - - - -

这就是我的文本文件的样子:

在此处输入图像描述

从蒂姆的回答来看, rowcol[0][0] 将打印 h 和, rowcol[0][ 1 ] 将打印 E ,但是 rowcol 的第一个 [] 为 null ,只要大于 0 ,它就会给我一个 null 错误,对象未设置为引用。

在此处输入图像描述

4

1 回答 1

1

我建议使用锯齿状数组,这样如果您遇到一行中有超过 10 列的情况,它不会抛出超出范围的错误。

我还建议使用File.ReadAllLines,因为它将返回文件中所有行的数组。

像这样的东西(未经测试)应该让你去:

string[] fileData = File.ReadAllLines(@"C:\Users\apr13mpsip\Documents\Visual Studio 2010\Projects\iStellarMobile\iStellarMobile\Puzzle\educational.txt");

string[] lineValues;

int row = 0;
int col;

string[][] rowcol = new string[fileData.Length][];

foreach (string line in fileData)
{
    lineValues = line.Split(new string[]{ ',' }, StringSplitOptions.None);

    rowcol[row] = new string[lineValues.Length];

    col = 0;

    foreach (string value in splits)
    {
        rowcol[row][col] = value;
        col++
    }

    row++;
}

这段代码的作用如下:

1. 用文本文件中的行填充数组`fileData`。
2. 设置一个数组来保存每一行的分割结果。
3. 为 row 和 col 声明变量,并将 row 设置为 0。
4. 将锯齿状数组“rowcol”的第一维设置为从“ReadAllLines”返回的行数组的长度(即行数)。
5. 遍历 `fileData` 中的每一行,执行以下操作:
    一个。在 ',' 上拆分当前行,并将结果放在 `lineValues` 中。
    湾。将当前行的第二个`rowcol`数组设置为等于长度
        数组`lineValues`(列数)。
    C。将 `col` 变量设置为 0(第一列)。
    d。循环遍历 `lineValues` 中的每个值,将当前值分配给
        当前行的正确列,然后增加列计数器。
6. 一旦内部循环完成,增加行计数器。

Edit rowcol是一个锯齿状数组(数组的数组),这基本上意味着您有一个数组,其中每个元素都是另一个数组引用。这些数组引用中的每一个都可以(但不必)具有不同的长度(在您的情况下它们没有)。

string rowcol[][] = new string[fileData.Length][];

这会将锯齿状数组 rowcol 初始化为长度等于文件中的行数 (10)。现在数组中有 10 个元素,但它们都是空的。

rowcol[row] = new string[lineValues.Length];

这会将当前元素(行)的数组引用初始化为等于拆分值的长度(数量)。继续您的示例,您知道数组中元素“row”处有“x”个元素(拆分中的值的数量),但它们为空。

rowcol[row][col] = value;

您知道有一个可以访问的值(字符串)。

因此,如果您在内部循环中,并且您的代码将打印 and 的值rowcol[0][0]rowcol[1][0]那么在第一次通过内部循环之后,您将获得 in 的值rowcol[0][0],但您不会进入,rowcol[1][0]因为您还没有到第 1 行,你还在第 0 行。

我在控制台应用程序中对此进行了测试,并在外循环完成使用以下代码段打印了锯齿状数组的值:

for (int i = 0; i < rowcol.GetLength(0); i++)
{
    for (int j = 0; j < rowcol[i].GetLength(0); j++)
    {
        Console.WriteLine("Row {0}, Col {1}: {2}", i, j, rowcol[i][j]);
    }
}

这导致以下输出(未显示整个输出,仅足以给出一般概念):

第 0 行,第 0 列:h
第 0 行,第 1 列:e
第 0 行,第 2 列:l
第 0 行,第 3 列:l
第 0 行,第 4 列:o
第 0 行,第 5 列:
第 0 行,第 6 列:
第 0 行,第 7 列:
第 0 行,第 8 列:
第 0 行,第 9 列:
第 1 行,第 0 列:o
第 1 行,第 1 列:
第 1 行,第 2 列:
第 1 行,第 3 列:
第 1 行,第 4 列:
第 1 行,第 5 列:
第 1 行,第 6 列:
第 1 行,第 7 列:
第 1 行,第 8 列:
第 1 行,第 9 列:
第 2 行,第 0 列:l
第 2 行,第 1 列:我
第 2 行,第 2 列:v
第 2 行,第 3 列:e
第 2 行,第 4 列:
第 2 行,第 5 列:
第 2 行,第 6 列:
第 2 行,第 7 列:
第 2 行,第 8 列:
第 2 行,第 9 列:
……
第 9 行,第 0 列:
第 9 行,第 1 列:
第 9 行,第 2 列:
第 9 行,第 3 列:d
第 9 行,第 4 列:
第 9 行,第 5 列:
第 9 行,第 6 列:
第 9 行,第 7 列:
第 9 行,第 8 列:
第 9 行,第 9 列:
于 2013-08-07T03:39:05.880 回答