2011-01-28 1 views
0

メーカーと呼ばれるオブジェクトのリストを作成するクラスがあります。 XMLファイルを使用して、ManufacturerListという配列に格納されているオブジェクトを作成します。リスト内のForeachオブジェクトに問題があります。 Txtファイル出力にすべての項目が含まれていませんか?

以下はManufacturerImportクラスのコードです。ここでオブジェクトを作成します。

private List<Manufacturer> ManufacturerList = new List<Manufacturer>(); 

    public void AddManufacturer(Manufacturer manu) 
    { 
     ManufacturerList.Add(manu); 
    } 

    public List<Manufacturer> GetManufacturers() 
    { 
     return ManufacturerList; 
    } 

ご覧のとおり、このリストをコードの他の部分に渡す必要があるため、GetManufacturers関数があります。私は、コードをデバッグし、リストが正常にmListにコピーされていることを発見した

List<Manufacturer> mList = ManuImport.GetManufacturers(); 

     TextWriter tw = new StreamWriter(@"C:\manu.txt"); 

     foreach (Manufacturer manu in mList) 
     { 

      //Output name to txt file. 
      tw.WriteLine(manu.ManufacturerName); 

      Console.WriteLine(manu.ManufacturerName); 
      Console.WriteLine(manu.ShortManufacturerName); 
      Console.WriteLine(manu.ManufacturerDirectory); 
      Console.WriteLine(manu.ManuId); 
      Console.WriteLine("------------------------"); 
     } 



    //Forgot to include this in example. Has been in code from beginning. sorry for confusion 
      tw.Close(); 

:私の主な機能には

は、私は、次のコードを使用しています。私は、mListリストに必要なすべてのオブジェクトがどのように格納されているのか少し混乱していますが、リストをステップ実行すると正しい出力が得られません。

私のリストには486個のオブジェクトがありますが、出力には333個しかtxtファイルに書き込まれません。奇妙なのは、コンソールが異なるメーカーをリストに出力するということです。

どのような考えも大きいでしょう。あなたはusingブロックであなたのTextWriterオブジェクトを囲む必要があり

乾杯

+1

出力ファイルを閉じずに、最後の153項目がバッファに残ります可能性はありますか? – Gabe

答えて

5

List<Manufacturer> mList = ManuImport.GetManufacturers(); 

using(TextWriter tw = new StreamWriter(@"C:\manu.txt")) 
{ 
    foreach (Manufacturer manu in mList) 
    { 

     //Output name to txt file. 
     tw.WriteLine(manu.ManufacturerName); 

     Console.WriteLine(manu.ManufacturerName); 
     Console.WriteLine(manu.ShortManufacturerName); 
     Console.WriteLine(manu.ManufacturerDirectory); 
     Console.WriteLine(manu.ManuId); 
     Console.WriteLine("------------------------"); 
    } 
} 

これには2つの理由があります

まず、基本的に、TextWriterはあなたがオブジェクトを終了している常にコールDispose()なければならないことを意味し、IDisposableを実装しています。 C#およびVB.NETのusingブロックは、Disposeが確実に呼び出されるようにする言語固有のメカニズムです。これはIDisposableを実装するすべてのオブジェクトに当てはまりますので、使用しているコードや他のフレームワークオブジェクトの他の領域を見て、このパターンに従っていることを確認することをお勧めします。あなたがに特別の注意を払うようにしたいかもしれないいくつかのものがあります:(ファイル等、いかなる種類のストリーム)

  • データベース接続
  • 何IO関連

第二に、この特定の場合のために、 TextWriterクラスは、書き込まれるデータをバッファリングします(たとえば、一度に1文字ずつデータを書き込む場合、「チャンク」で扱うため、EVERY文字のディスクIOはありません)。その結果、データがディスクに書き込まれるためには、バッファをフラッシュする必要があります。これは、3例の下で起こる:

  • バッファは、コード
  • でオブジェクトを使用する過程の下でいっぱいになるあなたはTextWriterを閉じるのいずれかClose()またはDispose()
  • を呼び出すことによって、手動でFlush()
  • を呼び出すことにより、バッファをフラッシュ

最初のものは、自動的に制御されるものではありません。後者は、バッファリングされたすべてのデータをすぐにディスクに書きたいが、ライターを開いたままにしたいという例外的なケースです。 2番目のケース - 最も重要な - は、あなたが欠けているものです。

+0

私は謝罪しなければならない、私は実際にtw.Close()を持っていた。コンソールのメイン機能の最後に表示されます。まだ私が期待するように動作していません。バッファーはすべてのデータに十分な大きさではないでしょうか? –

+0

私はとても愚かでした。私はtw.closeの上にconsole.readlineを見つけました。これは私がテキストライターを閉じていないことを意味しました。正しい方向に向いてくれてありがとうございました。 –

+0

@Michael:バッファサイズは、ディスクに到達する前にメモリに格納されているデータ量を決定するだけです。バッファは実際にどのくらいの頻度でデータが書き込まれるかを決定しません。 「mList」の内容が正しいことを確認しました(どのようにこれを確認しましたか?)b)コンソールに間違ったデータが表示されます(エントリが不足していますか、追加エントリですか? c)ファイルには、コンソールに表示されているものとは異なる*誤ったデータが表示されますか? –

関連する問題