J'ai la méthode suivante:
namespace ListHelper
{
public class ListHelper<T>
{
public static bool ContainsAllItems(List<T> a, List<T> b)
{
return b.TrueForAll(delegate(T t)
{
return a.Contains(t);
});
}
}
}
Le but est de déterminer si une liste contient tous les éléments d'une autre liste. Il me semble que quelque chose comme celui-ci serait déjà intégré à .NET, est-ce le cas et est-ce que je duplique la fonctionnalité?
Edit: Mes excuses pour ne pas avoir déclaré à l'avance que j'utilise ce code sur la version 2.4.2 Mono.
Réponses:
Si vous utilisez .NET 3.5, c'est simple:
Cela vérifie s'il y a des éléments dans
b
lesquels ne figurent pasa
- puis inverse le résultat.Notez qu'il serait légèrement plus conventionnel de rendre la méthode générique plutôt que la classe, et il n'y a aucune raison d'exiger à la
List<T>
place deIEnumerable<T>
- donc ce serait probablement préférable:la source
Inclus dans .NET 4: Enumerable.All
la source
Juste pour le plaisir, la réponse de @ JonSkeet comme méthode d'extension:
la source
public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Count() > 0; }
. J'ai essayé quelques comparaisons rapides de performanceshaystack.Count() - 1 >= haystack.Except(needle).Count();
et j'aiIntersect
semblé faire mieux la plupart du temps.Any()
notCount() > 0
:public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Any(); }
Vous pouvez également utiliser une autre méthode. Remplacer égal et utiliser ceci
la source
list l = new List<T>(check);
Je ne pense pas que cela compilerait et si c'est le cas, c'est totalement inutile, carcheck
c'est déjà une liste