2016-09-18 21 views
2

このコードでは、2冊の本を追加して1冊目と2冊目の本を削除しようとすると、1番目が削除され、2番目の帳は削除されません。次のケースでは、3冊の本を追加して1つずつ削除すると、削除すると1が削除され、2を削除すると2つと3つではなくなります。C#ライブラリ管理コンソールプログラム

私のコード(私は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); 
      } 
     } 
    } 
} 

答えて

0

問題は、あなたが本を削除するとき本がもはや反映IDSないので、あなたのブックリストを並べ替えされていることですあなたがそれらを追加したときの位置。 など。 bookListには2つの書籍(bookList [0]とbookList [1])があります。 1つの本を削除すると、booklist [0]が残っているので、次の本を削除しようとすると(コードにはdel -1を使用して位置を取得すると表示されます)、次に配列から削除しようとしていますbookList [1]もちろん存在しません。

0

booksは、bookId以上、具体的にはオブジェクトの一意のIDを使用して削除する必要があります。投稿されたコードは、ブックの位置を使用してリストから削除します。 bookIdを持つ唯一の目的は、booksの任意の番号から本を特定し、コードを使用してそれを素早く操作することです。

何らかの方法で役立つオブジェクト指向プログラミング(OOP)について教えてください。すべてのオブジェクトは、その中の3つの特徴があります。

  1. アイデンティティ
  2. 行動

をここでは、アイデンティティ(それを選択するために使用することができるbookIdのようなユニークなもの)は、その事ですオブジェクトの位置ではなく、オブジェクト(書籍)を操作するために使用する必要があります。

十分な理論は、あなたのコード

bookList.RemoveAt(Del - 1); 

では犯人です。 bookIdに基づいて動作するように変更して、問題を解決します。あなたはListArrayデータ構造を混合しているあなたのコードで

おかげ

0

。詳細を見てみましょう:

if (bookList.Exists(x => x.bookId == Del)) 

ここでは、書籍リストの反復検索を使用しています。まず第一に、追加の辞書を導入することでより速く行うことができ、あなたのプログラムはより速くなります。第二には、この後、あなたが本のidを取得し、それがリストではないとして、前回の本を削除するということですが、配列:

bookList.RemoveAt(Del - 1); 

予想通り、これは動作しないのはなぜ?それはあなたが3冊の本を追加したことを言うことができます、シンプルだし、(矢印はここであなたのリストにあるブック間のリンクです)のように、あなたのリストが見えます:

1 --> 2 --> 3 

あなたのリストがどのように見える二本削除した後:

は、
1 --> 3 

他の本を追加すると、IDは3になります!なぜなら、この行(ここでは2に等しいbookList.Count)の:

Console.WriteLine("Book Id:{0}", book.bookId = bookList.Count + 1); 

だからあなたのリストは、次のようになります。

1 --> 3 --> 3 

ですから、あなたの書籍の一意に識別するための追加のカウンターを維持する必要があります。もう一つのことは、リストからの簡単な削除のためにRemoveAll、リストへの簡単な検索のためのFindなど、使用できる追加のLINQメソッドがあることを覚えなければならないことです。 LINQ hereについてのアドバイスがあります。

0

書籍IDに問題があります。正しい本を特定するには、リスト内で一意でなければなりません。

ここはクイックフィックスです。

プロジェクトでLINQの名前空間を追加します。

using System.Linq; 

変更GetBook()メソッドリスト

var bookId = bookList.Count> 0 ? bookList.Max(b => b.bookId) : 0; 
Console.WriteLine("Book Id:{0}", book.bookId = bookId + 1); 
から最大書籍ID番号を使用して独自のbookIdを生成します
関連する問題