2013-08-07 6 views
0

Я создал 2 цикла foreach, и я получаю ошибку (индекс за пределами массива), потому что я использую 2 массива.wpf вложенный массив foreach index за пределами

Это то, что я делаю:

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++;      
    } 
} 

я уже глобальную строку [] столбец; и string [] rowcol;

Ошибка происходит в этой строке:

вар CurrentValue = rowcol [I] [J];

------- EDIT --------------------

Это как мой текстовый файл выглядит следующим образом:

enter image description here

от ответа Тима rowcol [0] [0] напечатает час и rowcol [0] [1] напечатает E, но первый [] из rowcol имеет нулевое значение, когда больше 0, это дает me null error, Object не установлен для ссылки.

enter image description here

+1

Вы пытаетесь получить доступ к 'rowcol' как 2-мерный массив, когда вы объявили это как одномерный массив. – Tim

+1

Что вы пытаетесь сделать с линиями? то есть, почему вы используете 2-мерный массив? – Tim

+0

, потому что у меня есть txtfile, у которого есть 10 строк и 10 запятых в каждой строке, поэтому я разделяю запятые, я получаю 10 столбцов. – user2376998

ответ

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. Populates the array `fileData` with the lines from the text file. 
2. Sets up an array to hold the split result on each line. 
3. Declares variables for row and col, and sets row to 0. 
4. Sets the first dimension of the jagged array `rowcol` to the length of the array of lines returned from `ReadAllLines` (i.e., the number of rows). 
5. Loop through each line in `fileData`, doing the following: 
    a. split the current line on ',' and put the results in `lineValues`. 
    b. Set the second array of `rowcol` for the current row equal to the length 
     of the array `lineValues` (number of columns). 
    c. Set the `col` variable to 0 (first column). 
    d. Loop through each value in `lineValues`, assigning the current value to 
     the proper column for the current row, and then increment the column counter. 
6. Once the inner loop is done, increment the row counter. 

Редактировать rowcol является зазубренный массив (массив массивов), что в основном означает, что у вас есть массив, где каждый элемент является другой ссылкой на массив. Каждая из этих ссылок массива может (но не обязательно) иметь разную длину (в вашем случае они этого не делают).

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

Это инициализирует массив jcged rowcol с длиной, равной количеству строк в вашем файле (10). Теперь у вас есть 10 элементов массива, но все они равны нулю.

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

Это инициализирует ссылку на массив для текущего элемента (строки), чтобы равняться длине (число) значений от раскола. Продолжая свой пример, вы знаете, что в элементе «строка» есть элементы «x» (количество значений из раскола), но они равны нулю.

rowcol[row][col] = value; 

У вас есть значение (строка), к которому вы можете получить доступ.

Так что, если вы во внутреннем цикле, и у вас есть код, который будет печатать значение rowcol[0][0] и rowcol[1][0], после того, как в первый раз через внутренний цикл вы будете иметь значение в rowcol[0][0], но вы не будете в rowcol[1][0], потому что вы не получили в строку-все же, вы все еще на строке 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]); 
    } 
} 

Это приводит следующий вывод (весь выход не отображается, просто достаточно, чтобы дать общее представление):

 
Row 0, Col 0: h 
Row 0, Col 1: e 
Row 0, Col 2: l 
Row 0, Col 3: l 
Row 0, Col 4: o 
Row 0, Col 5: 
Row 0, Col 6: 
Row 0, Col 7: 
Row 0, Col 8: 
Row 0, Col 9: 
Row 1, Col 0: o 
Row 1, Col 1: 
Row 1, Col 2: 
Row 1, Col 3: 
Row 1, Col 4: 
Row 1, Col 5: 
Row 1, Col 6: 
Row 1, Col 7: 
Row 1, Col 8: 
Row 1, Col 9: 
Row 2, Col 0: l 
Row 2, Col 1: i 
Row 2, Col 2: v 
Row 2, Col 3: e 
Row 2, Col 4: 
Row 2, Col 5: 
Row 2, Col 6: 
Row 2, Col 7: 
Row 2, Col 8: 
Row 2, Col 9: 
.... 
Row 9, Col 0: 
Row 9, Col 1: 
Row 9, Col 2: 
Row 9, Col 3: d 
Row 9, Col 4: 
Row 9, Col 5: 
Row 9, Col 6: 
Row 9, Col 7: 
Row 9, Col 8: 
Row 9, Col 9: 
+0

спасибо за помощь, проверьте мои изменения – user2376998

+0

Можете ли вы опубликовать код, который вы используете, что приводит к этой ошибке? Я просто проверил быстрый тест с указанным выше кодом, и он работал (за исключением опечатки в методе Split, который я только что исправил). – Tim

+0

Я заменил пролитую строку. и я использую то же, что и ваш, я добавил только для печати rowcol [0] [0] и напечатал rowcol [1] [0]; , [0] [0] в порядке, [1] [0] дал мне ошибку исключения null – user2376998

Смежные вопросы