2016-03-15 98 views
4

我有一個關於通過使用LINQ「搜索」其字段名稱來獲取列表對象的問題。我編寫簡單LibraryBook類這樣的:如何按列表中的屬性值獲取/查找對象

class Book 
{ 
    public string title { get; private set; } 
    public string author { get; private set; } 
    public DateTime indexdate { get; private set; } 
    public int page { get; private set; } 

    public Book(string title,string author, int page) 
    { 
     this.title = title; 
     this.author = author; 
     this.page = page; 
     this.indexdate = DateTime.Now; 
    } 
} 

class Library 
{ 
    List<Book> books = new List<Book>(); 

    public void Add(Book book) 
    { 
     books.Add(book); 
    } 

    public Book GetBookByAuthor(string search) 
    { 
     // What to do over here? 
    } 
} 

所以我想Book情況下,其某些字段等於特定字符串,如

if(Book[i].Author == "George R.R. Martin") return Book[i]; 

我知道這是可能用簡單的循環代碼,但我想用LINQ來做到這一點。有什麼辦法可以做到這一點?

+0

什麼是一個公共變種和私人二傳手的原因是什麼? – icbytes

+1

@icbytes,Book類是一個不可變的對象,在多線程代碼中非常有用。對於這個例子,沒有理由修改書籍對象。 –

+0

你從哪裏知道這件事? – icbytes

回答

5
var myBooks = books.Where(book => book.author == "George R.R. Martin"); 

而且記得要加:using System.Linq;

在你的具體的方法,因爲你只想返回一個本書,你應該寫:

public Book GetBookByAuthor(string search) 
{ 
    var book = books.Where(book => book.author == search).FirstOrDefault(); 
    // or simply: 
    // var book = books.FirstOrDefault(book => book.author == search); 
    return book; 
} 

Where返回IEnumerable<Book>,那麼FirstOrDefault將返回在可枚舉或null中找到的第一本書,如果找不到的話。

+0

'GetBookByAuthor'方法返回類型是'Book'不是'IEnumerable '所以這不起作用,直到您使用'FirstOrDefault'或將方法返回類型更改爲'IEnumerable '。 –

+0

是的你是對的,我也看到了。現在執行符合OP的要求 –

+0

@DoğaCanKılıç你解決了你的問題嗎? –

0
var books = books.Where(x => x.author == search).ToList(); 

你的書方法返回一個單一的書,我會建議返回列表,可能有不止一成書與作者。

2

你可以使用FirstOrDefault像這樣:

public Book GetBookByAuthor(string search) 
{ 
    return books.FirstOrDefault(c => c.author == search); 
} 
0

我會建議使用,而不是一個簡單的平等的IndexOf避免外殼的問題。

var myBooks = books.Where(x => x.author.IndexOf("George R.R. Martin", StringComparison.InvariantCultureIgnoreCase) >= 0); 

如果你只有一個在列表中找到的第一本書,使用

var myBook = books.FirstOrDefault(x => x.author.IndexOf("George R.R. Martin", StringComparison.InvariantCultureIgnoreCase) >= 0);