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

Using Linq to compare a list with a set of lists in C#

我有一个包含新闻故事的网站。每个故事都有一个与之关联的标签列表。该站点上的其他页面也有标签列表。 在其他页面之一上,我想列出所有具有一个或多个与当前页面上的标签列表相同的标签的新闻故事。 我已经编写了一些 Linq 代码,将单个标签与每个新闻报道中的标签进行比较,但我需要对其进行扩展,以便它可以处理标签列表。

query = query.Where(x => x.Tags.Contains(currentTag));

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

您可以使用 Intersect + Any:

query = query.Where(x => x.Tags.Intersect(tagList).Any());

这假定 Tags 实际上是 IEnumerable<string> 或覆盖 Equals + GetHashCode 的另一种类型。如果不是这种情况,您可以为 Intersect.

提供自定义 IEqualityComparer<Tag>

所以tagList是请求的当前页面的List<string>。但是如果你想在所有页面上列出所有与标签列表 有一个或多个标签的所有标签,那么 IEnumerable<List<string>>,你可以使用 SelectMany压平它们:

query = query.Where(x => x.Tags.Intersect(allTagLists.SelectMany(list => list)).Any());

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

query = query.Where(x => x.Tags.Any(t => tagList.Contains(t)));

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