2013-08-11 3 views
0

Я читаю строку за строкой из текстового файла, и я буду заполнять 100 текстовых полей из текстового файла (строка 10x10), в каждой строке есть 10 запятых, и в текстовом файле есть 10 строк, поэтому я пытаясь прочитать значение из текстового файла. Но, однако, это показывает, что Индекс оказался вне пределов, любая помощь?C# Индекс за пределами массива

string[] fileData = File.ReadAllLines(@"C:\Users\omgjyan\Desktop\OneOrganizer\OneOrganizer\WordPuzzle\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.RemoveEmptyEntries); 
    rowcol[row] = new string[lineValues.Length]; 

    col = 0; 

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

    row++; 

} 

for (int i = 0; i < rowcol.GetLength(0); i++) 
{ 
    for (int j = 0; j < rowcol[i].GetLength(0); j++) 
    { 
     TextBox tbox = new TextBox(); 

     int iadd = i + 1; 
     int iminus = i - 1; 
     int jadd = i + 1; 
     int jminus = i - 1; 
     var self = rowcol[i][j]; 
     var top = rowcol[iminus][j]; 
     var bottom = rowcol[iadd][j]; 
     var left = rowcol[i][jminus]; 
     var right = rowcol[i][jadd]; 

     if ((!String.IsNullOrEmpty(self) && String.IsNullOrEmpty(top) && String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && !String.IsNullOrEmpty(left)) || 
          (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && String.IsNullOrEmpty(bottom) && !String.IsNullOrEmpty(left)) || 
          (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(left)) || 
          (!String.IsNullOrEmpty(self) && String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(left)) || 
          (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && String.IsNullOrEmpty(left)) || 
          (!String.IsNullOrEmpty(self) && !String.IsNullOrEmpty(top) && String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && !String.IsNullOrEmpty(left)) || 
          (!String.IsNullOrEmpty(self) && String.IsNullOrEmpty(top) && !String.IsNullOrEmpty(right) && !String.IsNullOrEmpty(bottom) && !String.IsNullOrEmpty(left)) 
         ) 
    { 
     tbox.Text = "*"; 
    } 

    wrapPanel1.Children.Add(tbox); 
    } 
} 

У меня ошибка, указав, что индекс был вне пределов. Может ли это быть +1 и -1? как я могу решить, что

ошибка: enter image description here

+0

Какая строка кода получает исключение? –

ответ

2

Ваш код имеет:

for (int i = 0; i < rowcol.GetLength(0); i++) 
{ 
    for (int j = 0; j < rowcol[i].GetLength(0); j++) 
    { 
     int iadd = i + 1; 
     int iminus = i - 1; 
     int jadd = i + 1; 
     int jminus = i - 1; 

И затем вы пытаетесь получить доступ к массивы с

var self = rowcol[i][j]; 
var top = rowcol[iminus][j]; 
var bottom = rowcol[iadd][j]; 
var left = rowcol[i][jminus]; 
var right = rowcol[i][jadd]; 

Это будет на всех краевых случаев, потому что iminus будет один -1 и iadd будет rowcol.Length, и то же самое для jminus/jadd. Эти индексы находятся за пределами ваших массивов. Вы можете исправить это, просто отбрасывая крайние случаи в цикле:

for (int i = 1; i < rowcol.Length - 1; i++) 
{ 
    for (int j = 1; j < rowcol[i].Length - 1; j++) 
    { 
     int iadd = i + 1; 
     int iminus = i - 1; 
     int jadd = i + 1; 
     int jminus = i - 1; 

Это гарантирует, что вы не доступ к любым элементам вне границ массива. Но этого будет недостаточно, чтобы исключение никогда не происходило. Посмотрите еще раз на этих линиях:

var top = rowcol[iminus][j]; 
var bottom = rowcol[iadd][j]; 

Это это будет ошибкой, если длина rowcol[iminus] или rowcol[iadd] меньше rowcol[i]. Поэтому вам нужно будет проявлять особую осторожность, чтобы избежать этого. Возможно, что-то вроде этого:

for (int i = 1; i < rowcol.Length - 1; i++) 
{ 
    for (int j = 1; j < rowcol[i].Length - 1; j++) 
    { 
     int iadd = i + 1; 
     int iminus = i - 1; 
     int jadd = i + 1; 
     int jminus = i - 1; 
     if (j < rowcol[iminus].Length || j < rowcol[iadd].Length) 
     { 
      continue; 
     } 

Другим способом вы могли бы попробовать это было бы что-то вроде этого:

for (int i = 0; i < rowcol.Length; i++) 
{ 
    for (int j = 0; j < rowcol[i].Length; j++) 
    { 
     int iadd = i + 1; 
     int iminus = i - 1; 
     int jadd = i + 1; 
     int jminus = i - 1; 
     var self = rowcol[i][j]; 
     var top = iminus >= 0 && j < rowcol[iminus].Length ? rowcol[iminus][j] : string.Empty; 
     var bottom = iadd < rowcol.Length && j < rowcol[iadd].Length ? rowcol[iadd][j] : string.Empty; 
     var left = jminus >= 0 ? rowcol[i][jminus] : string.Empty; 
     var right = jminus < rowcol[i].Length ? rowcol[i][jadd] : string.Empty; 
+0

i did if i == 0 return, else var bottom, так ли это тоже? – user2376998

+0

@ user2376998 'return' немедленно выйдет из всего вашего метода. Я не думаю, что это то, что ты хочешь. –

+0

У меня все еще есть ошибка. – user2376998

0

Когда я и J равны 0, я - 1 и J - 1 оба -1, которые будут вызывать вне границ при попытке:

int iadd = i + 1; 
    int iminus = i - 1; 
    int jadd = i + 1; 
    int jminus = i - 1; 
    var self = rowcol[i][j]; 
    var top = rowcol[iminus][j]; //iminus is -1 first iteration! 
    var bottom = rowcol[iadd][j]; 
    var left = rowcol[i][jminus]; //jminus is -1 first iteration! 
    var right = rowcol[i][jadd]; 

Вы можете решить эту проблему, добавив проверки, что индексы фактически находятся в границах (и пропускают итерации там, где они отсутствуют).

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