Внутренний цикл пока запускается только один раз - PullRequest
0 голосов
/ 28 февраля 2012

Цель кода - найти часть строки (из одного документа) в длинном списке строк (другой документ) и вернуть результаты в список.

У меня есть два цикла while, один вложенный в другой.Внешний цикл читает каждую строку этого документа, а внутренний читает каждый цикл его документа.По некоторым причинам внутренний while выполняется только один раз (для первой итерации внешнего цикла).Можете ли вы объяснить, почему и как я мог это исправить?Кажется, что он читает все строки только один раз, а затем не читает их снова ... Мне нужно, чтобы внутренний цикл читал построчно каждый раз, когда запускается внешний цикл.

Вот мой код.

    private static void getGUIDAndType()
    {
        try
        {
            Console.WriteLine("Begin.");

            String dbFilePath = @"C:\WindowsApps\CRM\crm_interface\data\";
            StreamReader dbsr = new StreamReader(dbFilePath + "newdbcontents.txt");
            List<string> dblines = new List<string>();

            String newDataPath = @"C:\WindowsApps\CRM\crm_interface\data\";
            StreamReader nsr = new StreamReader(newDataPath + "HolidayList1.txt");
            List<string> new1 = new List<string>();

            string dbline;
            string newline;

            Program prog = new Program();

            while ((dbline = dbsr.ReadLine()) != null)
            {
                while ((newline = nsr.ReadLine()) != null)
                {
                    newline = newline.Trim();
                    if (dbline.IndexOf(newline) != -1)
                    {//if found... get all info for now
                        Console.WriteLine("FOUND: " + newline);
                        System.Threading.Thread.Sleep(1000);
                        new1.Add(newline);
                    }
                    else
                    {//the first line of db does not contain this line... 
                        //go to next newline. 
                        Console.WriteLine("Lines do not match - continuing");
                        continue;
                    }
                }
                nsr.Close();
                Console.WriteLine("should be run as many times as there are dblines");
                Console.WriteLine(newline);
                System.Threading.Thread.Sleep(5000);
                //continue;
            }

            Console.WriteLine("Writing to dbc2.txt");
            System.IO.File.WriteAllLines(@"C:\WindowsApps\CRM\crm_interface\data\dbc2.txt", new1.ToArray());
            Console.WriteLine("Finished. Press ENTER to continue.");

            Console.WriteLine("End.");
            Console.ReadLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error:  " + ex);
            Console.ReadLine();
        }
    }

Я попытался установить внутренний цикл как метод, но когда я ссылаюсь на dbline в методе, я получаю исключение ссылки на объект в этой строке: if (dbline.IndexOf(newline) != -1).На самом деле не тратил много времени, пытаясь это исправить, и вернулся к вложенным циклам;но если бы я использовал этот метод, я не думаю, что мой результат будет другим.

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

Спасибо.

Ответы [ 3 ]

3 голосов
/ 28 февраля 2012

Для каждой итерации внешнего цикла вам нужно перематывать StreamReader внутреннего цикла в начало файла:

  while ((dbline = dbsr.ReadLine()) != null)
  {
     // Reset
     nsr.BaseStream.Position = 0;
     nsr.DiscardBufferedData(); 

     while ((newline = nsr.ReadLine()) != null)
     {
       .....
     }
     nsr.Close(); // remove that

РЕДАКТИРОВАТЬ согласно комментарию:

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

3 голосов
/ 28 февраля 2012

Ваш внутренний цикл использует файл. Вернитесь к началу.

1 голос
/ 28 февраля 2012

Поскольку цикл while завершается без оператора break или return, это означает, что это условие цикла оценивается как ложное:

(newline = nsr.ReadLine()) != null

То есть nsr.Readline() возвращает null потому что вы достигли конца файла.

Если вы на самом деле намереваетесь читать строки несколько раз из nsr, вы можете перейти к началу, сбросив позицию на базовом Stream и отбросив StreamReader буфер:

nsr.BaseStream.Position = 0;
nsr.DiscardBufferedData();
...