【问题标题】:LINQ query to find common strings between two collectionsLINQ 查询以查找两个集合之间的公共字符串
【发布时间】:2010-11-08 12:03:30
【问题描述】:

鉴于以下不同的两个集合:

IQueryable<Book> allBooks = context.Books.Where(b => b.UserID == hostID);

var visBookTitles = context.Books.Where(b => b.UserID == visitorID)
.Select(b =>b.Title.ToLower()).ToList();

返回allBooks 中与visBookTitles 中的任何标题具有共同标题的所有书籍的最有效方法是什么(最好使用方法语法)?

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    如果集合中的项目应被视为相等,则使用Intersect();如果它们仅共享某些属性,则使用Join()。在您的情况下,您将书籍与标题相交,因此Join() 是最合适的。

    var query = allBooks.Join(visBookTitles,
                              book => book.Title,
                              title => title,
                              (book, title) => book);
    

    【讨论】:

      【解决方案2】:

      像这样:

      var bookTitles = new HashSet<string>(visBookTitles, StringComparer.OrdinalIgnoreCase);
      var someBooks = allBooks.AsEnumerable().Where(b => bookTitles.Contains(b.Title));
      

      您还应该摆脱ToLower 调用。 (StringComparer.OrdinalIgnoreCase 速度更快,可以处理混乱的 Unicode 情况)

      【讨论】:

      • 您需要AsEnumerable() 吗?你不能在IQueryable&lt;T&gt; 上使用Where 扩展吗?
      • @RPM:我假设他正在使用 LINQ to SQL 或 EF,在这种情况下使用 IQueryable&lt;T&gt; 会抛出异常,因为它无法转换为 SQL。
      • 啊,k - 够公平的。认为这是常规的 LINQ 对象。
      • 你必须写出 where 子句。 ...Where(b =&gt; bookTitles.Contains(b.Title));allBooksIEnumerable&lt;Book&gt; 并且没有 Contains() 方法将 Book 用于 HashSet&lt;string&gt;
      猜你喜欢
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多