c# - studio - Determine si una secuencia contiene todos los elementos de otra secuencia usando Linq
la secuencia no contiene elementos visual studio (4)
Esta pregunta ya tiene una respuesta aquí:
- Compruebe si una matriz es un subconjunto de otras 7 respuestas
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<int> hashSet = new HashSet<int>(superset);
bool contained = subset.All(i => hashSet.Contains(i));
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
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<T>(this IEnumerable<T> source, IEnumerable<T> values)
{
return values.All(value => source.Contains(value));
}