Вывести книги определенного автора по возрастанию года издания из файла

Рейтинг: 0Ответов: 1Опубликовано: 01.04.2015

Подскажите пожалуйста, где в коде логическая ошибка. В процессе выполнения 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

Ответы

▲ 1
var books = File.ReadLines(path, Encoding.Default).Select(ParseBook);

Меняем на

books = File.ReadLines(path, Encoding.Default).Select(ParseBook).ToList<Book>();

И почитайте Троелсена, особенно об использовании переменных и областях их видимости, по моему у вас это больное место.