给出两组值:
var subset = new[] { 2, 4, 6, 8 };
var superset = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
如何确定superset
是否包含subset
的所有元素?
我想出了这个:
superset.Intersect(subset).Count() == subset.Count()
这是最合乎逻辑且最有效的方法吗?
答案 0 :(得分:160)
计数?怎么样没有?
bool contained = !subset.Except(superset).Any();
答案 1 :(得分:28)
所以,我的另一个答案很容易使用。但这是一个O(n * m)解决方案。
这是一个稍微不太友好的O(n + m)解决方案。如果超集是巨大的,那么应该使用它。它避免重复枚举超集。
HashSet<int> hashSet = new HashSet<int>(superset);
bool contained = subset.All(i => hashSet.Contains(i));
答案 2 :(得分:12)
我有一个使用现有Contains()方法的扩展方法。我发现它比使用Instersect()或Except()更直观。
public static bool ContainsAll<T>(this IEnumerable<T> source, IEnumerable<T> values)
{
return values.All(value => source.Contains(value));
}
答案 3 :(得分:4)
您可以使用Except,结果计数应为0.
在MSDN上阅读有关参数的详细信息。
示例:
subset.Except(superset).Count() == 0