Eu tenho o seguinte 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);
});
}
}
}
O objetivo é determinar se uma lista contém todos os elementos de outra lista. Parece-me que algo assim já estaria integrado no .NET, é esse o caso e estou duplicando a funcionalidade?
Edit: Minhas desculpas por não declarar antecipadamente que estou usando este código no Mono versão 2.4.2.
Respostas:
Se você estiver usando .NET 3.5, é fácil:
Isso verifica se há elementos nos
b
quais não estãoa
- e então inverte o resultado.Observe que seria um pouco mais convencional tornar o método genérico em vez da classe, e não há razão para exigir em
List<T>
vez deIEnumerable<T>
- então provavelmente seria preferível:fonte
Incluído no .NET 4: Enumerable.All
fonte
Apenas por diversão, a resposta de @JonSkeet como um método de extensão:
fonte
public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Count() > 0; }
. Eu tentei algumas comparações rápidas de desempenhohaystack.Count() - 1 >= haystack.Except(needle).Count();
eIntersect
parecia me sair melhor na maioria das vezes.Any()
não useCount() > 0
:public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Any(); }
Você também pode usar outra maneira. Substituir igual e usar este
fonte
list l = new List<T>(check);
Eu não acho que isso iria compilar e se o fizer, é totalmente desnecessário, poischeck
já é uma lista