2016-04-15 100 views
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来操纵数据。任何帮助,将不胜感激谢谢! ]

+0

从任何List <>对象中删除时,您必须从列表的末尾开始并移至开头。如果你有一个列表1,2,3,4,你删除'2',当你在列表中前进时,最终跳过'3'。所以我使用(int index = myList.Count -1; index> = 0; index--)。 – jdweng

回答

1

在你Library类:

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

你应该用等于比较字符串 – rocketspacer

+0

嗯...为什么呢? –

+0

@nmtuan只有当其中一个值为'null'时,结果才会有所不同,但情况并非如此。 –

2

的技巧是使用for循环,而不是foreach一个环落后

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。几周后应该这样做,这样语法对我来说就是陌生的。 – Nate

+0

@Nate:不客气!有时候,一个古老的程序代码是我们经常忽略的。 –

0

喜用下面的代码在你的班级。它将处理您的列表对象的空检查

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

通常'。?'(都在'list?.RemoveAll'和'x?.Author'中)* mask *错误:更好的选择是抛出'NullPointerException'并且*调试*例程* early *。 –

相关问题