Déterminer si une séquence contient tous les éléments d’une autre séquence en utilisant Linq

Étant donné deux ensembles de valeurs:

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

Comment déterminer si le supersetsuperset contient tous les éléments du subsetsubset ?

Je suis venu avec ceci:

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

Est-ce la méthode la plus logique et la plus efficace?

Compter? Que diriez-vous pas?

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

Donc, mon autre réponse était assez facile à utiliser. Mais c’est une solution O (n * m).

Voici une solution légèrement moins conviviale pour O (n + m). Cela devrait être utilisé si le surensemble est énorme. Il évite d’énumérer à plusieurs resockets le surensemble.

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

J’ai une méthode d’extension qui utilise la méthode Contains () existante. Je trouve cela plus intuitif que d’utiliser Instersect () ou Except ().

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

Vous pourriez utiliser Except et le nombre résultant devrait être 0.

Lisez sur MSDN pour plus de détails sur les parameters.

Exemple:

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