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

jv2fixgn  于 5个月前  发布在  其他
关注(0)|答案(4)|浏览(51)

这个问题已经有答案了

Check whether an array is a subset of another(10个答案)
9年前关闭。
给定两组值:

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()


这是最合理、最有效的方法吗?

wydwbb8l

wydwbb8l1#

什么都没有怎么样?

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

字符串

pkwftd7m

pkwftd7m2#

所以,我的另一个答案很容易使用。但它是一个O(n*m)的解决方案。
这里有一个稍微不友好的O(n+m)解决方案。如果超集是HUGE,应该使用它。它避免了重复枚举超集。

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

字符串

unhi4e5o

unhi4e5o3#

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

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

字符串

9jyewag0

9jyewag04#

您可以使用Except,结果计数应为0。
有关参数的详细信息,请参阅MSDN。
范例:

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

字符串

相关问题