使用 Linq 确定一个序列是否包含另一个序列的所有元素

给定两组值:

var subset = new[] { 2, 4, 6, 8 };


var superset = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

如何确定 superset是否包含 subset的所有元素?

I have come up with this:

superset.Intersect(subset).Count() == subset.Count()

这是最符合逻辑和最有效的方法吗?

48664 次浏览

可以使用“除外”,结果计数应为0。

有关参数的详细信息,请阅读 MSDN。

例如:

subset.Except(superset).Count() == 0

伯爵? 一个都没有怎么样?

bool contained = !subset.Except(superset).Any();

因此,我的另一个答案很容易使用,但它是 O (n * m)解决方案。

这里有一个稍微不那么友好的 O (n + m)解。如果超集很大,则应该使用这种方法。它避免了重复枚举超集。

HashSet<int> hashSet = new HashSet<int>(superset);
bool contained = subset.All(i => hashSet.Contains(i));

我有一个扩展方法,它使用了现有的 Contains- 方法。

public static bool ContainsAll<T>(this IEnumerable<T> source, IEnumerable<T> values)
{
return values.All(value => source.Contains(value));
}