我有一个关于通过"搜索"来获取列表对象的问题。他们的字段名称使用LINQ。我为此编写了简单的Library
和Book
类:
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 :(得分:8)
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
。
答案 1 :(得分:2)
你可以使用FirstOrDefault
像这样:
public Book GetBookByAuthor(string search)
{
return books.FirstOrDefault(c => c.author == search);
}
答案 2 :(得分:0)
x
您的Book方法会返回一本书,我建议您返回一个列表,因为该作者可能会有多本书。
答案 3 :(得分: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);