代码之家  ›  专栏  ›  技术社区  ›  asfsadf

查找两个集合之间的公共字符串的Linq查询

  •  1
  • asfsadf  · 技术社区  · 16 年前

    考虑到以下两个不同的集合:

    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 ?

    2 回复  |  直到 16 年前
        1
  •  1
  •   SLaks    16 年前

    这样地:

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

    你也应该摆脱 ToLower 呼叫。( StringComparer.OrdinalIgnoreCase 更快,处理混乱的Unicode情况)

        2
  •  2
  •   Jeff Mercado    16 年前

    使用 Intersect() 集合中的项是否应被视为相等或 Join() 如果他们只共享某些财产。在你的例子中,你把书和书名交叉,所以 连接() 是最合适的。

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