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

时间:2010-11-08 03:29:54

标签: c# linq

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

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 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

像这样:

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

您还应该摆脱ToLower电话。 (StringComparer.OrdinalIgnoreCase速度更快,处理凌乱的Unicode情况)