我有以下方法:
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上使用此代码。
答案 0 :(得分:156)
如果您使用的是.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();
}
}
答案 1 :(得分:32)
只是为了好玩,@ JonSkeet的answer作为扩展方法:
/// <summary>
/// Does a list contain all values of another list?
/// </summary>
/// <remarks>Needs .NET 3.5 or greater. Source: https://stackoverflow.com/a/1520664/1037948 </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();
}
答案 2 :(得分:27)
包含在.NET 4中:Enumerable.All
public static bool ContainsAll<T>(IEnumerable<T> source, IEnumerable<T> values)
{
return values.All(value => source.Contains(value));
}
答案 3 :(得分:0)
您也可以使用其他方式。覆盖等于并使用此
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;
}
}