Mam następującą metodę:
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);
});
}
}
}
Celem jest określenie, czy lista zawiera wszystkie elementy innej listy. Wydaje mi się, że coś takiego byłoby już wbudowane w .NET, czy tak jest i czy powielam funkcjonalność?
Edycja: przepraszam za nie stwierdzenie z góry, że używam tego kodu w wersji Mono 2.4.2.
Odpowiedzi:
Jeśli używasz .NET 3.5, jest to łatwe:
Sprawdza, czy są jakieś elementy,
b
których nie maa
- a następnie odwraca wynik.Zwróć uwagę, że byłoby nieco bardziej konwencjonalne uczynienie metody generycznej zamiast klasy i nie ma powodu, aby wymagać
List<T>
zamiastIEnumerable<T>
- więc prawdopodobnie byłoby to preferowane:źródło
Zawarte w .NET 4: Enumerable.All
źródło
Tylko dla zabawy, @ JonSkeet za odpowiedź jako metodę rozszerzenia:
źródło
public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Count() > 0; }
. Próbowałem kilku szybkich porównań wydajnościhaystack.Count() - 1 >= haystack.Except(needle).Count();
iIntersect
wydawało się, że przez większość czasu radzę sobie lepiej.Any()
nie używajCount() > 0
:public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Any(); }
Możesz też użyć innego sposobu. Zastąp równa się i użyj tego
źródło
list l = new List<T>(check);
Nie sądzę, żeby to się skompilowało, a jeśli tak, jest to całkowicie niepotrzebne, ponieważcheck
jest już lista