如果 T2 是 T1 属性之一,如何检查 <T1> 的集合是不是包含 <T2> 的集合?

Posted

技术标签:

【中文标题】如果 T2 是 T1 属性之一,如何检查 <T1> 的集合是不是包含 <T2> 的集合?【英文标题】:How to check whether a collection of <T1> contains collection of <T2> if T2 is one of T1 property?如果 T2 是 T1 属性之一,如何检查 <T1> 的集合是否包含 <T2> 的集合? 【发布时间】:2017-10-31 06:54:05 【问题描述】:

我有一个本地 ID 列表,我需要检查 DB.Table 中是否存在此 ID。

我写了以下代码:

List<int> localIdList;
//filling localIdList
var idArrayFromDb = DB.Table
                     .Select(s => s.ID)
                     .ToArray();
bool isSubset = !localIdList
                .Except(idListFromDb)
                .Any();

目前它运作良好,但我认为这不是解决此问题的最佳方法。

所以我想知道,如果不从 DB 收集 Id 集合或其他更好的方法,我可以这样做吗?

【问题讨论】:

【参考方案1】:

一种方法是使用 List 的 Contain() 方法。

bool isSubset = DB.Table.Where(s => localIdList.Contains(s)).Any();

@CodeCaster 1 提到的一个drawback 是它会受到localIdList 长度的限制。

【讨论】:

这是否有效取决于 ID 列表的大小。 SQL Server 对可以在 IN() 子句中使用的值的数量有限制。此外,“尝试”不是答案,请解释您的代码在做什么。【参考方案2】:

试试这个

//sample
        List<int> t1 = new List<int>();
        t1.Add(1);
        t1.Add(2);
        t1.Add(3);

        List<int> t2 = new List<int>();
        t2.Add(2);

        bool res = t2.Any(a => t1.Any(b => b == a));
        Console.WriteLine("res :" + res);

    // your solution here
    bool isSubset  = DB.Table.Any(s => localIdList.any(l=> l == s.ID));

【讨论】:

以上是关于如果 T2 是 T1 属性之一,如何检查 <T1> 的集合是不是包含 <T2> 的集合?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查两列是不是相同/相等?

std::map<t1, t2>::erase(iterator position) 的工作?

表T2数据如何Update表T1中数据

Lua自己实现深度克隆一个值

OptimalSolution--二叉树问题子树与拓扑结构

遍历 2 个列表