2016-02-22 2 views
-1

Я поставил вопрос до этого, здесь: C# Array of List Index out of bounds Его о том же коде. Мой код работает нормально, но когда он заканчивает файл, вместо того, чтобы пробиваться к следующему имени файла (в цикле foreach), он остается тем же - так совпадают совпадения, которые всегда повторяются, и он просто добавляет один и тот же материал в разные позиции списка. Я попытался изменить положение fs.Close(), добавив оператор break, но ни один из них не работал.Потерянный в вложенной петле

Что я делаю неправильно в этом случае? На моем логическом представлении он должен перейти во внешний цикл после завершения конкретного файла.

Я редактировал код минимальной потребности - в любом случае здесь ссылку с полным кодом: http://pastebin.com/xcKczQLC

Эта связь со всем кодом содержит ту часть, где я открыть файл.

Спасибо.

foreach (string fileName in fullFileName) //Start processing each file 
{ 
    // Lots of code here - reading a mixed file - no need to show 

     bool b = filecontents.Contains("CIP3EndOfFile"); 
     if(b) 
     { 
      //Code manipulating contents in filecontents (a string) 




      var matches = Regex.Matches(query, pattern); 
      //When the foreach (Match m in matches) loop ends he always returns to the line above 
      finalcontent[listpos] = new List<xmldata>();//Initializing a list for each filename 

      foreach (Match m in matches) 
      { 

      //Lots of code doing some operations with the found match 

       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 
      if (i >= colors_str.Length) 
      { 
       listpos++; 
       i = 0; 
      } 
      fs.Close();//closing current file 
      //In this moment i expected that it would go for the foreach (string fileName in fullFileName) loop 
      //Instead he returns to this inner foreach loop 
     }//Closing boolean if 

    }//End file reading - closing for 




}//Finished processing each filename (string filename in filename) 
+1

Где вы открываете файл? – Valentin

+0

Его другая часть кода - чтобы соответствовать стандартам сообщества, я уменьшил код до минимально необходимого для анализа. Но я разместил ссылку на весь код. –

+0

Возможный дубликат [Разрыв в вложенном цикле] (http://stackoverflow.com/questions/324831/breaking-out-of-a-nested-loop) –

ответ

0

Может быть, вот ваша проблема:
Изменение:

 fs.Close();//closing current file 
     //In this moment i expected that it would go for the foreach (string fileName in fullFileName) loop 
     //Instead he returns to this inner foreach loop 
    }//Closing boolean if 

Для

 //In this moment i expected that it would go for the foreach (string fileName in fullFileName) loop 
     //Instead he returns to this inner foreach loop 
    }//Closing boolean if 
fs.Close();//closing current file 

Edit:
использование using позволяют кодирования безопаснее, он автоматически закрыть файл когда вы вышли из строя:

foreach (string fileName in fullFileName) //Start processing each file 
{ 
    using (var fs =new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
    { 
    } 
} 
+0

Такое же поведение. Он выполняет fs.Close(), но возвращается к той же точке, о которой я упоминал в вопросе. –

+0

Установите fs в ничто и повторно инициализируйте в следующем цикле. Объект может удерживать предыдущее значение. – Tom

+0

@PabloCosta не то же самое.В вашем коде вы только клонируете файл, если 'if (b)' is true, мой код закроет файл в обоих случаях. – Sakura

1

Вы не можете видеть его здесь, но в вашем Pastebin, у вас есть поле, называемое filename и локальную переменную с именем fileName и использовать их как взаимозаменяемые. Вам действительно нужно хорошо убирать, подумать, как вы называете переменные, и разбить этот материал на небольшие проблемы, чтобы его можно было отлаживать.

+0

Итак, вы предлагаете перестроить код, разбираясь на функции, а затем анализировать? Я планирую позже модулировать код, когда я его заработаю. Сначала я пытаюсь заставить все работать. –

+0

Модулизуйтесь по мере продвижения. Не так, потому что вы в этом состоянии! Но реальная проблема связана с локальной переменной, называемой 'fileName' –

+0

. Я изменил ее имя и изменил там, где он появляется в коде - то же самое. Также сделал то, что предложил @Sakura, и добавил «использование», чтобы он автоматически закрывался по мере его завершения. –