Я сделал приложение для книжной полки со списками. По сути, пользователь вводит количество книг, которые они хотели бы добавить, а затем делает это. Нижний метод является источником проблемы (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();
}
}
Кажется, все в порядке, поэтому я понятия не имею, почему это делается. У кого-нибудь есть предложения? Спасибо вам заранее.
Вы должны хранить списки как поля классов. В настоящее время вы используете их как локальные переменные, и они инициализируются каждый раз, когда вы вводите метод 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; }
}
Храните один список этих объектов вместо четырех разных списков.
Program
по умолчанию, но после небольшого исследования я увидел, что Program
- это имя метода)
Book
который инкапсулирует данные. Тогда вам нужен простоList<Book>
вместоList<...>
для каждого элемента данных.Book
в ответе, который вы приняли на свой предыдущий вопрос?