在列表中遇到Foreach对象的问题。 Txt文件输出不包含所有项目?

时间:2011-01-28 14:26:59

标签: c# list foreach

我有一个类正在创建一个名为manufacturer的对象列表。我使用XML文件来创建存储在名为ManufacturerList的阵列中的对象。

以下是ManufacturerImport类的代码。这是我创建对象的地方。

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

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

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

如您所见,我需要将此列表传递给我的代码的其他部分,因此我有一个GetManufacturers功能。

在我的Main函数中,我使用以下代码:

 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。关于mList列表如何包含我需要的所有对象,我有点困惑但是当我单步执行列表时,我得不到正确的输出。

我的列表有486个对象,但输出只将其中的333个写入txt文件。同样奇怪的是控制台输出不同的制造商到列表中。

任何想法都会很棒。

干杯

1 个答案:

答案 0 :(得分:5)

您需要将TextWriter对象括在using块中。

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("------------------------");
    }
}

这有两个原因:

首先,从根本上说,TextWriter实现了IDisposable,这意味着当你完成对象时,总是调用Dispose()。 C#和VB.NET中的using块是特定于语言的机制,用于确保调用Dispose。对于实现IDisposable的所有对象都是如此,因此查看代码的其他区域以及您正在使用的其他框架对象可能是个好主意,以确保您遵循此模式。您可能需要特别注意的一些事项是:

  • 数据库连接
  • 与IO相关的任何内容(文件,任何类型的流等)

其次,对于这种特殊情况,TextWriter类缓冲了写入的数据(例如,如果您一次将数据写入一个字符,则每个字符都没有磁盘IO ,因为它以“块”的形式出现。因此,必须刷新缓冲区才能将数据写入磁盘。这种情况发生在三种情况下:

  • 缓冲区在代码
  • 中使用对象的过程中填满
  • 您可以致电TextWriterClose()
  • 关闭Dispose()
  • 您可以通过调用Flush()
  • 手动刷新缓冲区

你无法控制的第一个,因为它是自动的。后者应该是一种特殊情况,您希望所有缓冲数据立即写入磁盘,但仍希望保持编写器打开。第二种情况 - 最重要的 - 就是你所缺少的。