Возникли проблемы с объектом Foreach в списке.Вывод файла Txt не содержит все элементы? - PullRequest
0 голосов
/ 28 января 2011

У меня есть класс, который создает список объектов, называемых производителями.Я использую 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 из них в текстовый файл.Также странно, что консоль выводит в список разных производителей.

Любые мысли были бы великолепны.

Приветствия

1 Ответ

5 голосов
/ 28 января 2011

Вам необходимо заключить объект 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(), когда закончите работу с объектом.Блок using в C # и VB.NET является языковым механизмом для обеспечения вызова Dispose.Это верно для всех объектов, которые реализуют IDisposable, поэтому, вероятно, будет хорошей идеей взглянуть на другие области вашего кода и другие объекты инфраструктуры, которые вы используете, чтобы убедиться, что вы следуете этому шаблону.Некоторые вещи, на которые вы могли бы обратить особое внимание:

  • Соединения с базой данных
  • Все, что связано с вводом-выводом (файлы, потоки любого типа и т. Д.)

Во-вторых, для этого конкретного случая класс TextWriter буферизует записываемые данные (так, например, если вы записываете данные по символу за раз, у вас нет дискового ввода-вывода для КАЖДОГО символа, так как онделает это "кусками").В результате буфер должен быть очищен для записи данных на диск.Это происходит в трех случаях:

  • Буфер заполняется при использовании объекта в коде
  • Вы закрываете TextWriter либо вызывая Close() или Dispose()
  • Вы вручную очищаете буфер, вызывая Flush()

Первый, который вы не можете контролировать, так как он автоматический.Последнее должно быть исключительным случаем, когда вы хотите, чтобы все буферизованные данные были немедленно записаны на диск, но при этом все равно нужно было оставить запись открытой.Второй случай - самый важный - это то, что вам не хватает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...