Ответ 1
граф? Как насчет не любого?
bool contained = !subset.Except(superset).Any();
Для двух наборов значений:
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()
Является ли это наиболее логичным и эффективным методом?
граф? Как насчет не любого?
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(). Я нахожу его более интуитивным, чем использование 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