2016-04-15 13 views
1

もう一度オブジェクトに関する質問に戻ります。 注記私は一般的にプログラミングに1ヶ月しかないので、これがばかげた質問であればごめんなさい。オブジェクトのリスト内の複数のオブジェクトをプロパティで削除する方法

今私はライブラリクラスとブッククラスをデザインしている宿題をいくつかやっています。このライブラリは数多くの本を保管することになっています。私はいくつかの方法でこのオブジェクトのリストを操作するはずです。方法のほとんどは、私が1つを除いて設計する方法を知っています。私は特定の著者とのすべての本のためにこのリストを検索し、それらを削除するはずです。私はこれに近づく方法を知らない。ブッククラスのプロパティを使用してリストから単一のオブジェクトを削除できますが、複数のオブジェクトを削除する方法はわかりません。ここで

class Library 
    { 
    public string Name { get; set; } 
    public List<Book> list = new List<Book>(); 
    public List<Book> foundBooks = new List<Book>(); 

    public Library(string name) 
    { 
     this.Name = name; 
    } 
    //Library Methods 
    public void AddBook(Book book) 
    { 
     list.Add(book); 
    } 

    public void PrintBookInfo(Book book) 
    { 
     Console.WriteLine("Title: "+ book.Title); 
     Console.WriteLine("Author " +book.Author); 
     Console.WriteLine("Publisher: "+ book.Publisher); 
     Console.WriteLine("Release Date: " + book.ReleaseDate.ToString()); 
     Console.WriteLine("ISBN: " + book.ISBN); 
     Console.WriteLine(); 
    } 

    public void PrintAllBooks() 
    { 
     foreach (Book book in list) 
     { 
      PrintBookInfo(book); 
     } 
    } 

    public Book SearchForBook(string name) 
    { 

     foreach (Book book in list) 
     { 
      if (book.Author == name) 
      { 
       PrintBookInfo(book); 
       return book;   

      } 

     } 
     return null; 
    } 

    public void DeleteBook(Book book)// this is the method im using to delete objects but I don't know how to extend this. 
    { 
     list.Remove(book); 
    } 
} 

私の本クラスは、最後に私のメインのこれまでの

class Book 
{ 
    //Properties 
    public string Title { get; set; } 
    public string Author { get; set; } 
    public string Publisher { get; set; } 
    public DateTime ReleaseDate { get; set; } 
    public int ISBN { get; set; } 


    public Book(string Title, 
     string Author, 
     string Publisher, 
     DateTime ReleaseDate, 
     int ISBN) 
    { 
     this.Title = Title; 
     this.Author = Author; 
     this.Publisher = Publisher; 
     this.ReleaseDate = ReleaseDate; 
     this.ISBN = ISBN; 
    } 
} 

です:私はこれを実装するために考え

 class Program 
{ 
    static void Main(string[] args) 
    { 
     var library = new Library("Yishun Regional Library"); 
     var bookOne = new Book("Harry Potter", "JK Rowling", "UK", DateTime.Today, 1165); 
     var bookTwo = new Book("Eragon", "Paolini", "Netherlands", DateTime.Today, 2565); 
     var bookThree = new Book("Harry", "JK Rowling", "UK", DateTime.Today, 1145); 

     library.AddBook(bookOne); 
     library.AddBook(bookTwo); 
     library.AddBook(bookThree); 

     Console.WriteLine("Hello Welcome To Yishun Library. Take a look at the books Availabe."); 
     Console.WriteLine(); 

     foreach (Book book in library.list) 
     { 
      library.PrintBookInfo(book); 
     } 

     Console.WriteLine(); 
     string name; 

     Console.WriteLine("Enter name of author: "); 
     name = Console.ReadLine(); 
     var bookFound = library.SearchForBook(name); 

     library.DeleteBook(bookFound); 
     Console.WriteLine("Current list of books: \n"); 

     library.PrintAllBooks(); 
    } 

一つの方法が見つかった図書の配列を作成してから削除することです本はforeachメソッドを使用していますが、これを実装する方法はわかりません。あるいは、私はすぐにforeachを使ってデータを操作できないことをすぐに知った。どんな助けもありがとう! ;]あなたLibraryクラスにおいて

+0

List <>オブジェクトから削除する場合は、リストの最後から開始して先頭に移動する必要があります。あなたがリスト1,2,3,4を持っていて、あなたが '2'を削除した場合、あなたはリストを通って進むときに '3'をスキップすることになります。したがって、私は(int index = myList.Count -1; index> = 0; index--)を使用します。 – jdweng

答えて

1

public void DeleteBooksByAuthor(string authorName) 
{ 
    list.RemoveAll(x => x.Author == authorName); 
} 
+0

文字列を比較するためにequalsを使用する必要があります – rocketspacer

+0

Hmmm ...なぜですか? –

+0

@nmtuan値の1つが「null」である場合にのみ結果が異なりますが、そうではありません。 –

2

トリック代わりforeach一方とループ後方forループを使用することである。

フォワード をループする場合に
for (int i = list.Count - 1; i >= 0; --i) 
     if (String.Equals(list[i].Author, "AuthorToDelete")) 
      list.RemoveAt(i); 

スキームはより複雑です:

for (int i = 0; i < list.Count;) 
     if (String.Equals(list[i].Author, "AuthorToDelete")) 
      list.RemoveAt(i); 
     else 
      i += 1; 

それともコール(それは宿題に受け入れられているのですか?)

list.RemoveAll(book => String.Equals(book.Author, "AuthorToDelete")); 
+0

実際にはむしろ簡単に実装するために見えます!私は認めていますが、私はそのように考えなかったでしょう。洞察に感謝します!とにかく、Linqはまだ触れられていません。構文が私にとって外国語であるように、2週間後にそうするべきです。 – Nate

+0

@ネイト:どうぞよろしく!時には古い良い手続き型コードがよく見落とすものです。 –

0

こんにちは、あなたのクラスに以下のコードを使用します。リストオブジェクトのヌルチェックも処理します。

public void DeleteBooksByAuthor(string authorName) 
    { 
     list?.RemoveAll(x => x?.Author == authorName); 
    } 
+0

多くの場合、 '。?'( 'list?.RemoveAll'と' x?.Author'の両方)* mask *エラー:より良い選択は 'NullPointerException'をスローし、* debug *ルーチンを早期*にすることです。 –

関連する問題