2012-02-21 62 views
0

我想比較WinForms中兩個文件的內容。每個文件都包含每行上帶有名稱和編號的行。我想從第一個文件讀取並與第二個文件進行比較。如果行不相等,我想提取它並將其添加到ArrayList。看看我到目前爲止做了什麼:比較c#中2個文件的內容#

Int32 nr = 0; 
     String linieinit=" ", liniewrt=" "; 
     ArrayList newlines = new ArrayList(); 
     using (StreamReader fileinit = new StreamReader(Application.StartupPath + "/bontemp" + label_pin.Tag.ToString() + "initial")) 
     { 
      using (StreamReader filewrt = new StreamReader(Application.StartupPath + "/bontemp" + label_pin.Tag.ToString())) 
      { 
       while ((linieinit = fileinit.ReadLine()) != null && (liniewrt = filewrt.ReadLine()) != null) 
       { 
        Console.WriteLine(linieinit + "  " + liniewrt); 
        if (linieinit.Equals(liniewrt)) 
        { 
         nr = 0; 
        } 
        else 
        { 
         nr++; 
         newlines.Add(liniewrt); 
        } 
       } 
       filewrt.Close(); 
       File.Delete(Application.StartupPath + "/bontemp" + label_pin.Tag.ToString()); 
      } 
      fileinit.Close(); 
      File.Delete(Application.StartupPath + "/bontemp" + label_pin.Tag.ToString() + "initial"); 

     } 
     Console.WriteLine(nr); 
     if (nr == 0) 
     { 
      int pozition = 0; 
      for (int i = 0; i < dataGridView1.Rows.Count; i++) 
      { 
       e.Graphics.DrawString(dataGridView1.Rows[i].Cells["DenumireProdus"].Value.ToString(), print6B, Brushes.Black, x, 130 + height); 
       e.Graphics.DrawString(dataGridView1.Rows[i].Cells["produs_cantitate"].Value.ToString(), print6B, Brushes.Black, x + 110, 130 + height); 
       height += 15; 
      } 
      if (pozition > height) 
      { 
       pozition = height; 
      } 
     } 
     else 
     { 
      for (Int32 j = 0; j < newlines.Count; j++) 
      { 
       e.Graphics.DrawString(newlines[j].ToString(), print6B, Brushes.Black, x, 130 + height); 
       height += 15; 
      } 
     } 

任何建議我怎麼能使它工作?

+1

就像一個不相關的代碼風格的評論...嵌套使用()語句讓我把我的頭髮,特別是當他們跨越很多的代碼。 – 2012-02-21 19:12:47

+4

問題是? – Magnus 2012-02-21 19:13:28

+0

那麼你需要什麼?什麼是你的[問題](http://stackoverflow.com/faq#questions)? – 2012-02-21 19:16:07

回答

4

你可以使用LINQ到這兩個文件相互比較:

var f1Lines = File.ReadAllLines(f1Path); 
var f2Lines = File.ReadAllLines(f2Path); 
var diffLines = f1Lines 
    .Where ((line, index) => index >= f2Lines.Length || line != f2Lines[ index ]) 
    .Select((line, index) => line).ToList(); 

在這條路上,你會發現在第一個文件,但不能在第二個文件中的所有行。

+0

diffLines是一個包含不同行的數組嗎? – 2012-02-21 19:25:59

+0

@Emil:'diffLines'是一個'List '(強類型ArrayList),它包含所有在第一個文件但不在第二個文件中的行(可以很容易地將其反轉)。如果你想要一個字符串數組,使用'ToArray'而不是'ToList'。 – 2012-02-21 19:28:07

+1

+1,但是如果文件真的很大,他應該小心,因爲它們一次加載到內存中。 – 2012-02-21 19:28:35

0

首先,如果您在使用語句中對流進行作用域範圍,則不需要在流上調用.Close()。

現在的文件版本比較的部分,我覺得這個邏輯是你的問題的根源:

if (linieinit.Equals(liniewrt)) 
{ 
    nr = 0; 
} 
else 
{ 
    nr++; 
    newlines.Add(liniewrt); 
} 

這裏是錯誤 - 如果所有的線條都不同,但最後一行是一樣的,你的「NR 「將被設置爲零。進一步向下檢查是否(nr == 0),相反,您可能有兩個變量一個用於numberOfSameLine,另一個用於numberOfDifferentLines,或者您可以用if(newLines.Count> 0)替換if邏輯 - 取決於您的應用程序邏輯。

+0

是的,我也注意到了。這似乎很奇怪。我曾假設它還有一些我可能不知道的含義 – 2012-02-21 19:29:06

0

閱讀完評論後,我想我知道你在找什麼。

你同時聲明:

while ((linieinit = fileinit.ReadLine()) != null && (liniewrt = filewrt.ReadLine()) != null) 
{ 

你已經達到了fileinit結束後,您的病情會停止評估爲true。如果要繼續添加從filewrtnewlines的行,則可以循環訪問filewrt的其餘部分。

nr++; 
newlines.Add(liniewrt); 
while((liniewrt = filewrt.ReadLine()) != null) 
{ 
    nr++; 
    newlines.Add(liniewrt); 
} 

您可以自行決定是否要保留nr++行。