Когда я печатаю свои списки, они пустые. Почему это?

1

Я сделал приложение для книжной полки со списками. По сути, пользователь вводит количество книг, которые они хотели бы добавить, а затем делает это. Нижний метод является источником проблемы (ListBooks). Я пытаюсь распечатать списки, но он печатает их пустым.

class Shelf
{
    public void Program()
    {
        List<string> bookTitle = new List<string>();
        List<string> bookAuthor = new List<string>();
        List<int> bookPageCount = new List<int>();
        List<int> bookWordCount = new List<int>();

        Console.WriteLine("1. Add Book.");
        Console.WriteLine("2. List Book.");
        Console.WriteLine("3. Quit.");

        int userEntry = int.Parse(Console.ReadLine());
        switch(userEntry)
        {
            case 1:
                AddBook(bookTitle, bookAuthor, bookPageCount, bookWordCount);
                break;

            case 2:
                ListBook(bookTitle, bookAuthor, bookPageCount, bookWordCount);
                break;

            case 3:
                Environment.Exit(1);
                break;
        }
    }

    public void AddBook(List<string> bookTitle, List<string> bookAuthor, List<int> bookPageCount, List<int>bookWordCount)
    {

        string title, author;
        int bookQuantity, pageCount, wordCount, userEntry;


        Console.WriteLine("Enter amount of books you would like to add.");
        bookQuantity = int.Parse(Console.ReadLine());


        for (int x = 1; x <= bookQuantity; x++)
        {
            Console.WriteLine("Enter title.");
            title = Console.ReadLine();
            bookTitle.Add(title);

            Console.WriteLine("Enter author.");
            author = Console.ReadLine();
            bookAuthor.Add(author);

            Console.WriteLine("Enter page count.");
            pageCount = int.Parse(Console.ReadLine());
            bookPageCount.Add(pageCount);

            Console.WriteLine("Enter word count.");
            wordCount = int.Parse(Console.ReadLine());
            bookWordCount.Add(wordCount);
        }


        Console.WriteLine("1. Main Menu.");
        userEntry = int.Parse(Console.ReadLine());

        switch(userEntry)
        {
            case 1:
                Program();
                break;

            default:
                Console.WriteLine("Please enter valid data.");
                Program();
                break;
        }
    }

    public void ListBook(List<string> bookTitle, List<string> bookAuthor, List<int> bookPageCount, List<int>bookWordCount)
    {

        int userEntry;

        Console.WriteLine("1. Titles.");
        Console.WriteLine("2. Authors.");

        userEntry = int.Parse(Console.ReadLine());

        switch(userEntry)
        {
            case 1:
                bookTitle.ForEach(Console.WriteLine); // Prints blank 
                break;

            case 2:
                bookAuthor.ForEach(Console.WriteLine); // Prints blank
                break;

            default:
                Console.WriteLine("Please enter valid data.");
                Program();
                break;
        }

        Console.ReadKey();
    }

}

Кажется, все в порядке, поэтому я понятия не имею, почему это делается. У кого-нибудь есть предложения? Спасибо вам заранее.

  • 4
    Вы действительно должны иметь класс Book который инкапсулирует данные. Тогда вам нужен просто List<Book> вместо List<...> для каждого элемента данных.
  • 1
    Почему вы не использовали класс Book в ответе, который вы приняли на свой предыдущий вопрос?
Теги:
console-application

1 ответ

3
Лучший ответ

Вы должны хранить списки как поля классов. В настоящее время вы используете их как локальные переменные, и они инициализируются каждый раз, когда вы вводите метод Program():

class Shelf
{
    List<string> bookTitle = new List<string>();
    List<string> bookAuthor = new List<string>();
    List<int> bookPageCount = new List<int>();
    List<int> bookWordCount = new List<int>();

    public void Program()
    {
       // removed from here
    }
}

ПРИМЕЧАНИЕ. Рекурсивная Program() - это плохая идея. Здесь это просто усложняет программную логику, и в какой-то момент вы закончите с StackOverflowException потому что вы получите очень глубокие рекурсивные вызовы. Вместо этого используйте петлю вокруг главного меню. Вы должны удалить вызовы Program() из других методов и использовать бесконечный цикл:

public void Program()
{
    List<string> bookTitle = new List<string>();
    List<string> bookAuthor = new List<string>();
    List<int> bookPageCount = new List<int>();
    List<int> bookWordCount = new List<int>();

    while (true)
    {
        Console.WriteLine("1. Add Book.");
        Console.WriteLine("2. List Book.");
        Console.WriteLine("3. Quit.");

        int userEntry = int.Parse(Console.ReadLine());
        switch (userEntry)
        {
            case 1:
                AddBook(bookTitle, bookAuthor, bookPageCount, bookWordCount);
                break;
            case 2:
                ListBook(bookTitle, bookAuthor, bookPageCount, bookWordCount);
                break;
            case 3:
                Environment.Exit(1);
                return;
        }
    }
}

Если вы хотите улучшить свой код дальше, то создайте класс книги, в котором будут храниться все данные книги

public class Book
{
   public string Title { get; set; }
   public string Author { get; set; }
   public int PageCount { get; set; }
   public int WordCount { get; set; }
}

Храните один список этих объектов вместо четырех разных списков.

  • 1
    Да, теперь вы получили это :)
  • 0
    @ Pierre-LucPineault спасибо :) На первый взгляд я подумал, что OP создает новые экземпляры класса Program по умолчанию, но после небольшого исследования я увидел, что Program - это имя метода)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню