【问题标题】:How to get a list which contains at least all the values of another list?如何获取至少包含另一个列表的所有值的列表?
【发布时间】:2014-04-25 10:21:21
【问题描述】:

我有一个列表必须至少包含另一个列表的值的情况。所以假设我们有一个列表 A,其值为 1、2、3。这是具有所需值的列表。

列表 B 的值是 1、5、6、7
列表 C 的值为 1、2、3、4、7
列表 D 的值为 2、5、6

在这种情况下,我只需要列表 C,因为这是唯一包含值 1、2 和 3 的列表。

我试过了,但这不起作用,因为它总是正确的:

query = from doc in query
        let tagIds = from t in doc.Tags select t.Id
        where parameters.TagIds.Except(tagIds).Count() <= parameters.TagIds.Count()
        select doc;

当使用这个时:

 query = from doc in query
        let tagIds = from t in doc.Tags select t.Id
        where !parameters.TagIds.Except(tagIds).Any<int>()
        select doc;

我只得到列表与“必需”列表完全匹配的列表。

我的问题是,如何解决我在 Linq 2 SQL 查询中的情况?

【问题讨论】:

  • 抱歉,我没有发现 linq-to-sql 的特定部分。

标签: c# linq linq-to-sql


【解决方案1】:

试试

var query = from doc in query
            let tagIds = from t in doc.Tags select t.Id
            where parameters.All(p => tagIds.Contains(p))
            select doc;

【讨论】:

  • 这似乎可行,谢谢。与此同时,我找到了另一个解决方案,但您的解决方案更具可读性:where parameters.TagIds.Intersect(tagIds).Count() == parameters.TagIds.Count()
【解决方案2】:

试试这个链接

Does .NET have a way to check if List a contains all items in List b?

在这里,您可以在所有可用列表中运行相同的上述方法。

public static bool ContainsAllItems(List<T> a, List<T> b)
{
    return !b.Except(a).Any();
}

这会检查 b 中是否有任何元素不在 a - 中,然后反转结果。

【讨论】:

  • 这正是我的第一个代码示例。这将检查 b 是否包含 a 的所有项目。当 a 有更多项目时,它将返回 false。但是,就我而言,我不介意 a 是否有更多项目,只要 b 至少具有 a 的所有项目。
猜你喜欢
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多