Определите, содержит ли последовательность все элементы другой последовательности, используя Linq

Для двух наборов значений:

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

Является ли это наиболее логичным и эффективным методом?

Ответ 1

граф? Как насчет не любого?

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

Ответ 2

Итак, мой другой ответ был довольно прост в использовании. Но это решение O (n * m).

Здесь немного менее дружественное решение O (n + m). Это следует использовать, если надмножество ОГРОМНОЕ. Это позволяет избежать повторного перечисления надмножества.

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

Ответ 3

У меня есть метод расширения, который использует существующий метод Contains(). Я нахожу его более интуитивным, чем использование Instersect() или Except().

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

Ответ 4

Вы можете использовать Except и итоговый счет должен быть 0.

Прочитайте в MSDN подробную информацию о параметрах.

Пример:

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