【问题标题】:Using Linq to compare a list with a set of lists in C#使用 Linq 将列表与 C# 中的一组列表进行比较
【发布时间】:2015-04-24 08:52:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# linq list comparison


    【解决方案1】:

    你可以使用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 中效率较低,因为它不使用集合。

    【讨论】:

    • 谢谢,但是当查询执行时我得到:The method 'Intersect' is not supported. Declaring type: System.Linq.Enumerable
    • x 是来自 Lucene 索引的一组页面。 x.TagsIEnumerable<string>
    • query = query.Where(x => x.Tags.Contains("tag 1")); 有效,但 query = query.Where(x => x.Tags.Intersect(tagList).Any()); 无效
    • 那是什么 LINQ 提供程序,query 是什么?在 LINQ to objects 中这可行,也许您正在使用不支持 Intersect 的提供程序(如 Linq-To-Entities)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多