Ich habe die folgende Methode:
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);
});
}
}
}
Der Zweck besteht darin, festzustellen, ob eine Liste alle Elemente einer anderen Liste enthält. Es scheint mir, dass so etwas bereits in .NET integriert ist. Ist das der Fall und dupliziere ich die Funktionalität?
Bearbeiten: Ich entschuldige mich dafür, dass ich nicht im Voraus angegeben habe, dass ich diesen Code in Mono Version 2.4.2 verwende.
Antworten:
Wenn Sie .NET 3.5 verwenden, ist dies ganz einfach:
Dies prüft, ob es Elemente gibt, in
b
denen nicht enthalten ista
- und invertiert dann das Ergebnis.Beachten Sie, dass es etwas konventioneller wäre, die Methode generisch anstatt der Klasse zu machen, und es gibt keinen Grund,
List<T>
stattdessen zu verlangenIEnumerable<T>
- daher wäre dies wahrscheinlich vorzuziehen:quelle
In .NET 4 enthalten: Enumerable.All
quelle
Nur zum Spaß, die Antwort von @ JonSkeet als Erweiterungsmethode:
quelle
public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Count() > 0; }
. Ich habe einige schnelle Leistungsvergleiche versuchthaystack.Count() - 1 >= haystack.Except(needle).Count();
undIntersect
schien die meiste Zeit besser abzuschneiden.Any()
nichtCount() > 0
:public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Any(); }
Sie können auch einen anderen Weg verwenden. Override ist gleich und benutze dies
quelle
list l = new List<T>(check);
Ich glaube nicht, dass dies kompiliert werden würde, und wenn ja,check
ist es völlig unnötig, wie es bereits eine Liste ist