2016-03-15 99 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);