Determine si una secuencia contiene todos los elementos de otra secuencia usando Linq

Dado dos conjuntos de valores:

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

¿Cómo determino si el superset contiene todos los elementos del subset ?

He venido con esto:

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

¿Es este el método más lógico y eficiente?

¿Contar? ¿Qué tal, nada?

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

Entonces, mi otra respuesta fue bastante fácil de usar. Pero es una solución O (n * m).

Aquí hay una solución O (n + m) ligeramente menos amigable. Esto debería usarse si el superconjunto es ENORME. Evita repetidamente enumerar superconjunto.

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

Tengo un método de extensión que usa el método existente Contiene (). Me resulta más intuitivo que usar Instersect () o Except ().

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

Podría usar Except y el recuento resultante debería ser 0.

Lea en MSDN para obtener detalles de los parámetros.

Ejemplo:

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