Исследование MS Visual С#, страница 12

private string version;  // Строка аутентификации файла

private string fileName; // Имя файла со списком

public List()

{

  men = new ArrayList();  // Создаем новую коллекцию

  bModified = false;      // Устанавливаем флаги

  bNew = false;

  version = "MySoft, Man List v. 1.0";// Строка аутотентификации файла произвольна

  fileName = "List.txt";  // Имя файла по умолчанию тоже произвольно

}

public void Mode()  // Выбор режима работы

{

  Console.WriteLine("\n\t\t Linear List");

  while (true) // Цикл опроса команд пользователя

  {

     switch (Helper.Menu())

     {

     case 'q':   Quit();     return; // Пока такого метода нет

     case 's':   Show();     break;

     case 'a':   Add();   break;

     case 'd':   Delete(); break;

     case 'r':   Read();     break;

     case 'w':   Write(); break;

  }

}

public void Add()

{

  Console.Write("\n\tInsert: Press \"Enter\" to stop inserting\n");

  while (true) //==== Бесконечный цикл ввода данных

  {

     Man m;   // Пока неинициализированная ссылка

     switch (Helper.ManMenu())// Выбор типа объекта производится на этапе выполнения

     {

     case 'q': return;   // Выбор пользователя: выйти из режима

     case 's': m = new Stud();  break; // Выбор пал на студента

     case 'p': m = new Prof();  break; // Выбор пал на профессора

     default: continue;

     }

     m.In();  // Здесь работает полиморфизм

     men.Add(m); // Добавляем новую ссылку

     bModified = true;  // Список изменился

  }

}

public void Show()

{

  // Ваш код

}

public void Quit()

{

  if (bModified) // Если список был изменен

  {

    Console.Write( "\n\t\tList has been changed. Save (y/n)?  ");

     string s = Console.ReadLine().ToUpper();

     if (s.Equals("Y"))

       Write();

  }

}

public object FileOpen (string fn, bool bRead)

{

  object file; // Тип возвращаемого значения (ссылка на объект)

  if (bRead)  // Если файл открывается в режиме чтения

  {

     try  // Пытаемся создать потокового «читателя»

     {

       file = new StreamReader(fn);

     }

     catch (FileNotFoundException e)

     {

       Console.WriteLine(e.Message);

       return null;

     }

    StreamReader sr = (StreamReader)file; // Специализируем object file (для чтения)

     string line = sr.ReadLine(); // Вычитываем первую строку аутентификации файла

     if (!line.Equals(version))     // Если это не наш файл, то уходим

     {

       Console.WriteLine("\nWrong file format: " + fn);

       sr.Close();

       return null;

     }

     sr.ReadLine();   // Пропуск пустой строки

  }

  else // Если файл открывается в режиме записи

  {

     try    // Пытаемся создать потокового «писателя»

     {

       file = new StreamWriter(fn);

     }

     catch (IOException e)

     {

       Console.WriteLine(e.Message);

       return null;

     }

     StreamWriter sw = (StreamWriter)file; // Специализируем объект (для записи)

     sw.Write (version + "\n\n");   // Записываем секретную строку и отступ заголовка

  }

  return file;  // Возвращаем ссылку на «читателя» или "писателя" (файл)

}

public void Write()

{

  //==== Вставьте код, ориентируясь на подсказки

  //==== Если список пуст, то уходим

  //==== Имя файла пока пусто

  StreamWriter sw = null; // Создаем «писателя»

  //===== Пытаемся открыть файл в режими  записи

  if ((sw = (StreamWriter)FileOpen (fileName, false)) == null)

    return;

  //===== Просим объекты вывести данные в поток sw

  //===== Закрываем поток

  Console.WriteLine(fileName + " has been stored");

  //===== Корректируем флаги состояния

  bNew = false;

  bModified = false;

}

public void Read()

{

  StreamReader sr = (StreamReader)FileOpen (fileName, true); // Создаем «читателя»

  if (sr == null) // Пытаемся открыть файл с именем fileName

  {

     Console.Write("\nCan not read file: " + fileName);

     return;

  }

  if (men.Count != 0) // Если в памяти есть список, то уничтожаем его

  {

     Console.WriteLine("Deleting current list");

     men.Clear();

  }

  Console.WriteLine("Reading from: " + fileName); // Готовимся построчно считывать данные

  string line;

  while ((line = sr.ReadLine()) != null) // Считываем строки текста, пока «читатель» их находит

  {

     Man m;

     switch (line[0]) // В зависимости от первого символа строки

     {

     case 'S':   m = new Stud();  break;

     case 'P':   m = new Prof();  break;

     default:    // Реагируйте на ошибку return;

     }

     m.Read (line); // Просим объект прочесть свои данные

     men.Add(m); //Добавляем ссылку в список

  }

  bModified = false; // Корректируем состояние списка и закрываем поток

  bNew = false;

  sr.Close();

  Console.WriteLine ("\n\nLinear List of Man\n");// Выводим весь список на экран

  foreach (Man m in men)

     Console.WriteLine(m);

}

public void Delete()

{

  //===== Если список пуст, уходим

  //===== Пока список не пуст, предлагаем выбрать жертву

while (men.Count > 0)

  {

     Console.Write("\n\tDelete\t0...{0} (0 - to Quit): ",men.Count);

     string s = Console.ReadLine();

     int n = Helper.MakeInt(s, 0, men.Count);

     if (n <= 0)

       break;

     //==== Удаляем ссылку на объект из коллекции men

     //==== Корректируем состояние списка и показываем его

     //===== Выводим результат

  }

}

}

Класс List готов. При выбранной тактике управления списком функция Main выглядит просто.

static void Main()

{

  List list = new List();

  list.Mode();

}