使用Linq将列表与C#中的一组列表进行比较

fil*_*ein 5 c# linq comparison list

我有一个包含新闻故事的网站.每个故事都有一个与之关联的标签列表.该网站上的其他页面也有一个标签列表.在其他一个页面上,我想列出所有与当前页面上的标签列表共有一个或多个标签的新闻报道.我编写了一些Linq代码,将单个标记与每个新闻报道上的标记进行比较,但我需要对其进行扩展,以便它与标记列表一起使用.

query = query.Where(x => x.Tags.Contains(currentTag));
Run Code Online (Sandbox Code Playgroud)

我想要做的是替换currentTag标签列表.该列表可以包含1到6个标签.有人可以帮忙吗?

Tim*_*ter 7

你可以使用Intersect+ Any:

query = query.Where(x => x.Tags.Intersect(tagList).Any());
Run Code Online (Sandbox Code Playgroud)

这假设Tags实际上是一种IEnumerable<string>或另一种覆盖Equals+的类型GetHashCode.如果不是这种情况,你可以提供自定义IEqualityComparer<Tag>Intersect.

所以, tagListList<string>的CURENT页的的要求.但是如果你想列出所有与所有页面上的标签列表共有一个或多个标签的所有标签,那么IEnumerable<List<string>>你可以用它SelectMany来展平它们:

query = query.Where(x => x.Tags.Intersect(allTagLists.SelectMany(list => list)).Any());
Run Code Online (Sandbox Code Playgroud)

如果Intersect您的LINQ提供程序不支持,您可以使用以下方法:

query = query.Where(x => x.Tags.Any(t => tagList.Contains(t)));
Run Code Online (Sandbox Code Playgroud)

这在LINQ-To-Objects中效率较低,因为它不使用集合.