У .NET есть способ проверить, содержит ли List a все элементы в списке b?
У меня есть следующий метод:
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);
});
}
}
}
Целью этого является определение того, содержит ли List все элементы другого списка. Мне кажется, что что-то вроде этого будет встроено в .NET уже, это тот случай, и я дублирую функциональность?
Изменить: Приношу свои извинения за то, что я не использую этот код в Mono версии 2.4.2.
Ответы
Ответ 1
Если вы используете .NET 3.5, это легко:
public class ListHelper<T>
{
public static bool ContainsAllItems(List<T> a, List<T> b)
{
return !b.Except(a).Any();
}
}
Это проверяет, есть ли какие-либо элементы в b
которых нет в a
и затем инвертирует результат.
Обратите внимание, что было бы немного более привычным делать метод универсальным, а не классом, и нет никаких причин требовать List<T>
вместо IEnumerable<T>
- так что это, вероятно, будет предпочтительнее:
public static class LinqExtras // Or whatever
{
public static bool ContainsAllItems<T>(this IEnumerable<T> a, IEnumerable<T> b)
{
return !b.Except(a).Any();
}
}
Ответ 2
Просто для удовольствия, @JonSkeet answer в качестве метода расширения:
/// <summary>
/// Does a list contain all values of another list?
/// </summary>
/// <remarks>Needs .NET 3.5 or greater. Source: /questions/83422/does-net-have-a-way-to-check-if-list-a-contains-all-items-in-list-b/548327#548327 </remarks>
/// <typeparam name="T">list value type</typeparam>
/// <param name="containingList">the larger list we're checking in</param>
/// <param name="lookupList">the list to look for in the containing list</param>
/// <returns>true if it has everything</returns>
public static bool ContainsAll<T>(this IEnumerable<T> containingList, IEnumerable<T> lookupList) {
return ! lookupList.Except(containingList).Any();
}
Ответ 3
Включено в .NET 4: Enumerable.All
public static bool ContainsAll<T>(IEnumerable<T> source, IEnumerable<T> values)
{
return values.All(value => source.Contains(value));
}
Ответ 4
Вы также можете использовать другой способ. Переопределить равные и использовать это
public bool ContainsAll(List<T> a,List<T> check)
{
list l = new List<T>(check);
foreach(T _t in a)
{
if(check.Contains(t))
{
check.Remove(t);
if(check.Count == 0)
{
return true;
}
}
return false;
}
}