Вывести книги определенного автора по возрастанию года издания из файла
Подскажите пожалуйста, где в коде логическая ошибка. В процессе выполнения Exeption'ов нет,как и ошибок. Только если шагать - можно увидеть в блоке значений переменных, что
Представление результатов Раскрытие представления результатов вызовет перечисление IEnumerable - base {"Входная строка имела неверный формат."} System.SystemException {System.FormatException}
Код:
public class Book//Хранить данные из файла о книгах в строковом предствалении в программе не рационально - создаем свой класс
{
public string Author
{
get;
set;
}
public string Title
{
get;
set;
}
public int PublicationYear
{
get;
set;
}
}
Продолжение:
class Program
{
public static Book ParseBook(string str)
{
Book book = new Book();
char separator = ':';
var tmp = str.Split(separator);
book.Author = tmp[0];
book.Title = tmp[1];
book.PublicationYear = Convert.ToInt32(tmp[2]);
return book;
}
//Создаем и инициируем переменную path в Классе Program, чтобы смогли использовать ее во всех функциях класса
static string path = @".\Books\Books.txt";//Присваиваем переменной относительную ссылку на наш файл(Использование .\ говорит нам о том, что начальная пака - папка запуска exe файла
static List<Book> books = new List<Book>();
static string DoShowMenu()
{
if (!(File.Exists(path)))//Проверяем, существует ли наш файл с данными о книгах
{
Console.Write("Файл с книгами не существует!\nНажмите любую клавишу для завершения программы...");
Console.ReadKey();//Программа продолжит выполнение только после того, как пользователь нажмет клавишу
Environment.Exit(0);//Из MSDN:Завершает этот процесс и возвращает внутренней операционной системе указанный код выхода.используйте 0 (ноль), чтобы указать, что процесс прошел успешно.
return "error";//Этот код никогда не выполнится,но функция имеет возвращаемое значение типа string нужно вернуть что-либо,чтобы избежать ошибки на уровне компиляции
}
else if (new FileInfo(path).Length == 0)
{
Console.Write("Файл с книгами пустой!\nНажмите любую клавишу для завершения программы...");
Console.ReadKey();//Программа продолжит выполнение только после того, как пользователь нажмет клавишу
Environment.Exit(0);//Из MSDN:Завершает этот процесс и возвращает внутренней операционной системе указанный код выхода.используйте 0 (ноль), чтобы указать, что процесс прошел успешно.
return "error";//Этот код никогда не выполнится,но функция имеет возвращаемое значение типа string нужно вернуть что-либо,чтобы избежать ошибки на уровне компиляции
}
else//Только когда проверяем,что файл существует и не пуст(за корректность данных во входном файле ответственности не несем), выводим меню пользователю.
{
Console.WriteLine("=================================================================\nВыберите номер пункта меню:\n1 - Выбрать автора\n2 - Фамилии авторов и год издания книг «Информатика»");
var books = File.ReadLines(path, Encoding.Default).Select(ParseBook);
return Console.ReadLine();
}
}
static void Main(string[] args)
{
string selectedOption;
selectedOption = DoShowMenu();//Функция DoShowMenu() передает перменной selectedOption выбранный пользователем пункт меню
linkSelectAgain://Ссылка на код, где выбор меню проверится снова;
if (selectedOption == "1")//если выбран 1 пункт меню
{
Console.Clear();
Console.Write("Книги какого автора вы ищете?\nНапример, Рихтер Д. или Рихтер:\n");
string selectedAuthor = Console.ReadLine();//Функция Console.ReadLine() передает перменной selectedAuthor выбранного автора
var booksWrittenBySelectedAuthor = books.Where(b => b.Author == selectedAuthor).OrderBy(b => b.PublicationYear).ToList();
foreach(var n in booksWrittenBySelectedAuthor)
{
Console.WriteLine("{0}:{1}:{2}", n.Author, n.Title, n.PublicationYear);
}
Console.ReadKey();
}
else if (selectedOption == "2")//если выбран 2 пункт меню
{
}
else//если выбран несуществующий пункт меню
{
Console.Clear();//Очищаем консоль
Console.WriteLine("Ошибка: Вы ввели несуществующий пункт меню, попробуйте еще раз...");//Выведим сообщение об об ошибке отдельной командой Console.WriteLine для читабельности кода
Console.WriteLine("=================================================================\nВыберите номер пункта меню:\n1 - Выбрать автора\n2 - Фамилии авторов и год издания книг «Информатика»");
selectedOption = Console.ReadLine();//Функция Console.ReadLine() передает перменной selectedOption выбранный пользователем пункт меню
goto linkSelectAgain;//Заставляем выполняться проверку выбора пункта меню еще раз (44 строка кода)
}
}
}
}
Файл:
Рихтер Д.:Программирование на платформе Microsoft .NET Framework:2002
Рихтер Д.:программирование на C# для профессионалов = Windows Runtime via C#:2014
Рихтер Д.: CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C#:2007
Рихтер Д.:Programming Server-Side Applications for Microsoft Windows:2000