如何通过列表中的属性值获取/查找对象

时间:2016-03-15 15:53:41

标签: c# linq

我有一个关于通过"搜索"来获取列表对象的问题。他们的字段名称使用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做到这一点。有没有办法实现这个目标?

4 个答案:

答案 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);