Tengo el siguiente método:
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);
});
}
}
}
El propósito de esto es determinar si una lista contiene todos los elementos de otra lista. Me parece que algo como esto ya estaría integrado en .NET, ¿es ese el caso y estoy duplicando la funcionalidad?
Editar: Mis disculpas por no decir desde el principio que estoy usando este código en Mono versión 2.4.2.
Respuestas:
Si está utilizando .NET 3.5, es fácil:
Esto comprueba si hay elementos en los
b
que no estána
incluidos y luego invierte el resultado.Tenga en cuenta que sería un poco más convencional hacer que el método sea genérico en lugar de la clase, y no hay razón para requerir en
List<T>
lugar deIEnumerable<T>
, por lo que probablemente sea preferible:fuente
Incluido en .NET 4: Enumerable.All
fuente
Solo por diversión, la respuesta de @ JonSkeet como método de extensión:
fuente
public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Count() > 0; }
. Probé algunas comparaciones rápidas de rendimientohaystack.Count() - 1 >= haystack.Except(needle).Count();
yIntersect
pareció hacerlo mejor la mayor parte del tiempo.Any()
notCount() > 0
:public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Any(); }
También podría utilizar otra forma. Anule los iguales y use esto
fuente
list l = new List<T>(check);
No creo que esto se compile y, si lo hace, es totalmente innecesario, yacheck
que ya es una lista