2012-02-28 60 views
0

代碼的作用是在一長串字符串(另一個文檔)中查找字符串的一部分(來自一個文檔),並將結果返回給列表。Inner While Loop只運行一次

我有兩個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)。沒有花太多時間來解決這個問題,並回到嵌套循環;但如果我採用這種方法,我不認爲我的結果會有任何不同。

如果你能想到一個更好的方式來做我想做的事,請讓我知道。我無法使用包含,因爲我引用的兩個txt文檔中的行不完全相同。

謝謝。

+1

多大的文件:

如果你真的打算多次從nsr讀線,則可以通過底層Stream上重新定位並丟棄StreamReader的緩衝尋求的開始?我建議刪除StreamReader並簡單地使用'File.ReadAllLines' http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx – asawyer 2012-02-28 18:33:50

回答

3

對於外部循環的每次迭代,你需要在內部循環的StreamReader倒退到文件的開頭:根據

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

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

編輯評論:

也需要在內部循環之後移除StreamReader的Close(),並在外部循環之後移動它。

+1

並刪除內部後的Close()循環。 – 2012-02-28 18:36:10

+0

'StreamReader'沒有'Position'屬性......它需要在底層的'Stream'上設置。 – Rob 2012-02-28 18:43:14

+0

@robjb:查看編輯 – thumbmunkeys 2012-02-28 18:47:33

3

您的內部循環消耗該文件。追溯到開始。

1

由於您的while循環沒有breakreturn聲明終止,這意味着這個循環條件評估爲false:

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

也就是說,nsr.Readline()正在恢復null因爲你已經打檔案結尾。

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