¿Tiene .NET una forma de verificar si la Lista a contiene todos los elementos en la Lista b?

Tengo el siguiente método:

namespace ListHelper { public class ListHelper { public static bool ContainsAllItems(List a, List 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 así debería estar integrado en .NET, ¿es así y estoy duplicando la funcionalidad?

Editar: Mis disculpas por no decir desde el principio que estoy usando este código en la versión Mono 2.4.2.

Si usa .NET 3.5, es fácil:

 public class ListHelper { public static bool ContainsAllItems(List a, List b) { return !b.Except(a).Any(); } } 

Esto comprueba si hay elementos en b que no están en a – 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 ninguna razón para requerir List lugar de IEnumerable , por lo que probablemente sería preferible:

 public static class LinqExtras // Or whatever { public static bool ContainsAllItems(IEnumerable a, IEnumerable b) { return !b.Except(a).Any(); } } 

Solo por diversión, la respuesta de @JoSkeet como método de extensión:

 ///  /// Does a list contain all values of another list? ///  /// Needs .NET 3.5 or greater. Source: https://stackoverflow.com/a/1520664/1037948  /// list value type /// the larger list we're checking in /// the list to look for in the containing list /// true if it has everything public static bool ContainsAll(this IEnumerable containingList, IEnumerable lookupList) { return ! lookupList.Except(containingList).Any(); } 

Incluido en .NET 4: Enumerable.All

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

También podrías usar otra forma. Anular Iguales y usar esto

 public bool ContainsAll(List a,List check) { list l = new List(check); foreach(T _t in a) { if(check.Contains(t)) { check.Remove(t); if(check.Count == 0) { return true; } } return false; } }