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

给定两组值:

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

我如何确定superset包含subset superset所有元素?

我已经想出了这个:

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

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

计数? 不怎么样?

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

所以,我的其他答案很容易使用。 但它是一个O(n * m)的解决scheme。

这是一个不太友好的O(n + m)解决scheme。 如果超集是巨大的,应该使用这个。 它避免了重复列举超集。

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

我有一个使用现有的Contains()方法的扩展方法。 我发现它比使用Instersect()或Except()更直观。

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

你可以使用Except,结果计数应该是0。

在MSDN上阅读有关参数的详细信息。

例:

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