【问题标题】:How to get/find an object by property value in a list如何通过列表中的属性值获取/查找对象
【发布时间】:2016-03-15 15:53:40
【问题描述】:

我有一个关于通过使用 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 来做到这一点。有什么方法可以实现吗?

【问题讨论】:

  • public var 和 private setter 的原因是什么?
  • @icbytes,Book类是一个不可变对象,在多线程代码中非常有用。对于此示例,没有理由修改书籍对象。
  • 你是从哪里知道的?
  • 因为这个类默认是私有的?
  • 问题应该是“如何通过字段内容获取/查找对象”,而不是字段名称。

标签: c# linq


【解决方案1】:
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&lt;Book&gt;,然后FirstOrDefault 返回在可枚举中找到的第一本书,如果没有找到则返回null

【讨论】:

  • GetBookByAuthor 方法的返回类型是 Book 而不是 IEnumerable&lt;Book&gt;,所以这在您使用 FirstOrDefault 或将方法返回类型更改为 IEnumerable&lt;Book&gt; 之前不起作用。
  • 是的,你是对的,我也看到了。现在实现符合 OP 的要求
【解决方案2】:

你可以像这样使用FirstOrDefault

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

【讨论】:

    【解决方案3】:
    var books = books.Where(x => x.author == search).ToList();
    

    您的 Book 方法返回一本书,我建议返回一个列表,因为该作者可能不止一本。

    【讨论】:

      【解决方案4】:

      我建议使用 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);
      

      【讨论】:

        猜你喜欢
        • 2014-02-04
        • 1970-01-01
        • 2013-01-02
        • 1970-01-01
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        • 2013-07-05
        相关资源
        最近更新 更多