2012-02-21 7 views
0

WinFormsの2つのファイルの内容を比較したいと思います。すべてのファイルには、各行に名前と番号の付いた行が含まれています。最初のファイルから読み込み、2番目のファイルと比較したい。行が等しくない場合は、それを抽出してArrayListに追加します。これまで行ってきたことを見てください。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

無関係なコードスタイルコメントと同じように...()ステートメントを使用してネストすると、特にコードがたくさんあるときに私の髪を裂けます。 –

+4

そして、質問は? – Magnus

+0

何が必要ですか?あなたの[質問](http://stackoverflow.com/faq#questions)は何ですか? –

答えて

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は異なる行を含む配列ですか? –

+0

@Emil: 'diffLines'は、第2のファイルではなく、最初の行にあるすべての行を含む' List '(強い型のArrayList)です(簡単に元に戻すことができます)。文字列配列が必要な場合は、 'ToList'の代わりに' ToArray'を使います。 –

+1

+1クリーンなセマンティックコードですが、メモリに一度にロードするため、ファイルが本当に大きい場合は注意が必要です。 –

0

まず、usingステートメント内でそのストリームをスコープする場合は、ストリーム上で.Close()を呼び出す必要はありません。

は、今一部の差分のファイルに対して、私はこのロジックは、あなたの問題の原因だと思う。ここで

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

はバグです - すべての行が異なっているが、最後の行は、あなたの「NR同じである場合"はゼロに設定されます。さらに、if(nr == 0)をチェックする代わりに、numberOfSameLineとnumberOfDifferentLinesの2つの変数を持つことができます。ifロジックをif(newLines.Count> 0)に置き換えることができます。

+0

ええ、私もそれに気づいた。それは奇妙に思えた。私はそれが他の意味を持っていると思っていました。 –

0

コメントのスレッドを読んだ後、私はあなたが探しているものを知っていると思います。

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

あなたがfileinitの最後に到達した後、あなたの条件がtrueに評価を停止します:

あなたはwhile文です。 filewrtからnewlinesに行を続けて追加する場合は、残りのfilewrtをループするだけです。

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

あなたがでたりないnr++ラインを維持したいかどうかについて、独自の意思決定を行うことができます。

関連する問題