[英]C# Library Management console program
在此代碼中,當我添加 2 本書並嘗試刪除第一本書和第二本書時,第一本書被刪除,而第二本書沒有。 在下一種情況下,當我添加 3 本書並一一刪除時,1 會被刪除,2 不會被刪除,而當我刪除 2 時,第三本書會丟失。當我添加 4 本書時,2 和 4 沒有被刪除。
我的代碼(我是一名實習生,所以我是 C# 的初學者)
using System;
using System.Collections.Generic;
namespace LibraryManagement
{
//Defining a class Book
class Book
{
public int bookId;
public string bookName;
public int bookPrice;
public int bookCount;
public int x;
}
//Defining a class Borrow
class BorrowDetails
{
public int userId;
public string userName;
public string userAddress;
public int borrowBookId;
public DateTime borrowDate;
public int borrowCount;
}
class Program
{
static List<Book> bookList = new List<Book>();
static List<BorrowDetails> borrowList = new List<BorrowDetails>();
static Book book = new Book();
static BorrowDetails borrow = new BorrowDetails();
//Password verfication and Menu
static void Main(string[] args)
{
Console.Write("Welcome !!!\nEnter your password :");
string password = Console.ReadLine();
if (password == "sync")
{
bool close = true;
while (close)
{
Console.WriteLine("\nMenu\n" +
"1)Add book\n" +
"2)Delete book\n" +
"3)Search book\n" +
"4)Borrow book\n" +
"5)Return book\n" +
"6)Close\n\n");
Console.Write("Choose your option from menu :");
int option = int.Parse(Console.ReadLine());
if (option == 1)
{
GetBook();
}
else if (option == 2)
{
RemoveBook();
}
else if (option == 3)
{
SearchBook();
}
else if (option == 4)
{
Borrow();
}
else if (option == 5)
{
ReturnBook();
}
else if (option == 6)
{
Console.WriteLine("Thank you");
close = false;
break;
}
else
{
Console.WriteLine("Invalid option\nRetry !!!");
}
}
}
else
{
Console.WriteLine("Invalid password");
}
Console.ReadLine();
}
//To add book details to the Library database
public static void GetBook()
{
Book book = new Book();
Console.WriteLine("Book Id:{0}", book.bookId = bookList.Count + 1);
Console.Write("Book Name:");
book.bookName = Console.ReadLine();
Console.Write("Book Price:");
book.bookPrice = int.Parse(Console.ReadLine());
Console.Write("Number of Books:");
book.x = book.bookCount = int.Parse(Console.ReadLine());
bookList.Add(book);
}
//To delete book details from the Library database
public static void RemoveBook()
{
Book book = new Book();
Console.Write("Enter Book id to be deleted : ");
int Del = int.Parse(Console.ReadLine());
if (bookList.Exists(x => x.bookId == Del))
{
bookList.RemoveAt(Del - 1);
Console.WriteLine("Book id - {0} has been deleted", Del);
}
else
{
Console.WriteLine("Invalid Book id");
}
bookList.Add(book);
}
//To search book details from the Library database using Book id
public static void SearchBook()
{
Book book = new Book();
Console.Write("Search by BOOK id :");
int find = int.Parse(Console.ReadLine());
if (bookList.Exists(x => x.bookId == find))
{
foreach (Book searchId in bookList)
{
if (searchId.bookId == find)
{
Console.WriteLine("Book id :{0}\n" +
"Book name :{1}\n" +
"Book price :{2}\n" +
"Book Count :{3}", searchId.bookId, searchId.bookName, searchId.bookPrice, searchId.bookCount);
}
}
}
else
{
Console.WriteLine("Book id {0} not found", find);
}
}
//To borrow book details from the Library
public static void Borrow()
{
Book book = new Book();
BorrowDetails borrow = new BorrowDetails();
Console.WriteLine("User id : {0}", (borrow.userId = borrowList.Count + 1));
Console.Write("Name :");
borrow.userName = Console.ReadLine();
Console.Write("Book id :");
borrow.borrowBookId = int.Parse(Console.ReadLine());
Console.Write("Number of Books : ");
borrow.borrowCount= int.Parse(Console.ReadLine());
Console.Write("Address :");
borrow.userAddress = Console.ReadLine();
borrow.borrowDate = DateTime.Now;
Console.WriteLine("Date - {0} and Time - {1}", borrow.borrowDate.ToShortDateString(), borrow.borrowDate.ToShortTimeString());
if (bookList.Exists(x => x.bookId == borrow.borrowBookId))
{
foreach (Book searchId in bookList)
{
if (searchId.bookCount >= searchId.bookCount - borrow.borrowCount && searchId.bookCount - borrow.borrowCount >= 0)
{
if (searchId.bookId == borrow.borrowBookId)
{
searchId.bookCount = searchId.bookCount - borrow.borrowCount;
break;
}
}
else
{
Console.WriteLine("Only {0} books are found", searchId.bookCount);
break;
}
}
}
else
{
Console.WriteLine("Book id {0} not found", borrow.borrowBookId);
}
borrowList.Add(borrow);
}
//To return borrowed book to the library
public static void ReturnBook()
{
Book book = new Book();
Console.WriteLine("Enter following details :");
Console.Write("Book id : ");
int returnId = int.Parse(Console.ReadLine());
Console.Write("Number of Books:");
int returnCount = int.Parse(Console.ReadLine());
if (bookList.Exists(y => y.bookId == returnId))
{
foreach (Book addReturnBookCount in bookList)
{
if (addReturnBookCount.x >= returnCount + addReturnBookCount.bookCount)
{
if (addReturnBookCount.bookId == returnId)
{
addReturnBookCount.bookCount = addReturnBookCount.bookCount + returnCount;
break;
}
}
else
{
Console.WriteLine("Count exists the actual count");
break;
}
}
}
else
{
Console.WriteLine("Book id {0} not found", returnId);
}
}
}
}
您應該使用bookId
或更具體地通過對象的唯一 Id 刪除books
。 您發布的代碼正在使用 book 的位置將其從列表中刪除。 擁有bookId
的唯一目的是從任意數量的books
識別這本書,然后使用代碼快速操作它。
讓我告訴你一些關於面向對象編程 (OOP) 的事情,它會以某種方式幫助你。 每個對象都具有三個特征:
在這里,身份(像bookId
這樣獨特的bookId
,可以用來選擇它)是你應該用來操作你的對象(書籍)的東西,而不是對象的位置。
足夠的理論,在你的代碼中
bookList.RemoveAt(Del - 1);
是罪魁禍首。 將其更改為在bookId
的基礎上bookId
,您的問題將得到解決。
謝謝
問題在於,當您刪除一本書時,您的書單會被重新排序,因此書的 ID 不再反映添加它們時它們所處的位置。 例如,您的 bookList 有 2 本書(bookList[0] 和 bookList[1])。 當您刪除 1 本書時,您只剩下 booklist[0],因此當您嘗試刪除下一本書時(使用您的代碼,它說您使用 del -1 來獲取位置),然后您嘗試從數組中刪除bookList[1] 這當然不存在。
在您的代碼中,您正在混合List
和Array
數據結構。 讓我們仔細看看:
if (bookList.Exists(x => x.bookId == Del))
在這里,您將在圖書列表中使用迭代搜索一本書。 首先,你可以通過引入額外的字典來更快地完成,那么你的程序就會更快。 其次,在此之后,您將獲得書的id
,並刪除前一本書,因為它不是列表,而是數組:
bookList.RemoveAt(Del - 1);
為什么這不能按預期工作? 很簡單,假設您添加了三本書,您的列表如下所示(此處的箭頭是列表中書籍之間的鏈接):
1 --> 2 --> 3
刪除第二本書后,您的列表如下所示:
1 --> 3
如果您添加另一本書,它的 id 將等於3
! 因為這一行( bookList.Count
在這里等於 2):
Console.WriteLine("Book Id:{0}", book.bookId = bookList.Count + 1);
所以你的列表看起來像這樣:
1 --> 3 --> 3
因此,您必須維護額外的計數器,以便為您的書籍提供唯一標識。 另一件事是您必須學習可以使用的其他 LINQ 方法,例如RemoveAll
可輕松從列表中刪除, Find
可輕松搜索列表,等等。 您可以在此處找到有關 LINQ 的一些建議。
問題是書號不一致。 它在列表中應該是唯一的,以識別正確的書籍。
這是快速修復。
在項目中添加 Linq 命名空間:
using System.Linq;
修改 GetBook() 方法以使用列表中的最大圖書 ID 編號生成唯一的 bookId
var bookId = bookList.Count> 0 ? bookList.Max(b => b.bookId) : 0;
Console.WriteLine("Book Id:{0}", book.bookId = bookId + 1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.