有关如何检查该列表是否是另一个列表的任何想法?
具体来说,我有
Listt1 = new List { 1, 3, 5 }; List t2 = new List { 1, 5 };
如何使用LINQ检查t2是否为t1的子集?
bool isSubset = !t2.Except(t1).Any();
如果使用集合,请使用HashSet而不是List.然后你可以简单地使用IsSubsetOf()
HashSett1 = new HashSet {1,3,5}; HashSet t2 = new HashSet {1,5}; bool isSubset = t2.IsSubsetOf(t1);
对不起,它不使用LINQ.:-(
如果你需要使用列表,那么@Jared的解决方案可以解决你需要删除任何存在的重复元素的问题.
如果您是单元测试,您还可以使用CollectionAssert.IsSubsetOf方法:
CollectionAssert.IsSubsetOf(subset, superset);
在上述情况下,这意味着:
CollectionAssert.IsSubsetOf(t2, t1);
@ Cameron的解决方案作为扩展方法:
public static bool IsSubsetOf(this IEnumerable a, IEnumerable b) { return !a.Except(b).Any(); }
用法:
bool isSubset = t2.IsSubsetOf(t1);
(这与@ Michael博客上发布的内容类似,但不完全相同)
这是一个比这里发布的其他解决方案更有效的解决方案,尤其是顶级解决方案:
bool isSubset = t2.All(elem => t1.Contains(elem));
如果你能在t2中找到一个不在t1中的单个元素,那么你知道t2不是t1的子集.与使用.Except或.Intersect的解决方案不同,这种方法的优点是它可以在所有就地完成,而无需分配额外的空间.此外,该解决方案能够在找到违反子集条件的单个元素时立即中断,而其他元素继续搜索.下面是解决方案的最佳长形式,在我的测试中仅比上述速记解决方案略快.
bool isSubset = true; foreach (var element in t2) { if (!t1.Contains(element)) { isSubset = false; break; } }
我对所有解决方案进行了一些基本的性能分析,结果非常激烈.这两个解决方案比.Except()和.Intersect()解决方案快约100倍,并且不使用额外的内存.