У меня есть такой способ:
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);
});
}
}
}
Цель этого метода - определить, содержит ли список все элементы другого списка. Мне кажется, что что-то подобное уже встроено в .NET, так ли это, и дублирую ли я функциональность?
Изменить: приношу свои извинения за то, что не сказал заранее, что я использую этот код в Mono версии 2.4.2.
Ответы:
Если вы используете .NET 3.5, это просто:
Это проверяет, есть ли какие-либо элементы,
b
которых нет,a
и затем инвертирует результат.Обратите внимание, что было бы немного более традиционным сделать метод универсальным, а не классом, и нет причин требовать
List<T>
вместоIEnumerable<T>
- так что это, вероятно, будет предпочтительнее:источник
Включено в .NET 4: Enumerable.All
источник
Просто для удовольствия, ответ @JonSkeet как метод расширения:
источник
public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Count() > 0; }
. Я попробовал несколько быстрых сравнений производительностиhaystack.Count() - 1 >= haystack.Except(needle).Count();
и,Intersect
похоже, большую часть времени у меня получалось лучше.Any()
не используйтеCount() > 0
:public static bool ContainsAny<T>(this IEnumerable<T> haystack, IEnumerable<T> needle) { return haystack.Intersect(needle).Any(); }
Вы также можете использовать другой способ. Переопределить равно и использовать это
источник
list l = new List<T>(check);
Я не думаю, что это будет компилироваться, и если это произойдет, в этом нет необходимости, так какcheck
это уже список