118 votes

Déterminer si une séquence contient tous les éléments d'une autre séquence à l'aide de 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 superset contient tous les éléments de subset ?

Je suis venu avec ceci:

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

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

201voto

David B Points 53123

Compter? Que diriez-vous de pas?

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

34voto

David B Points 53123

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 O (n + m). Ceci devrait être utilisé si le surensemble est énorme. Cela évite d'énumérer plusieurs fois le sur-ensemble.

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

14voto

Anders Points 101

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

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

4voto

leppie Points 67289

Vous pouvez utiliser Except et le nombre résultant doit être 0.

Consultez MSDN pour plus de détails sur les paramètres.

Exemple:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X