Does .NET have a way to check if List a contains all items in List 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 是否包含另一个 List 的所有元素。在我看来,像这样的东西会被嵌入。NET,是这种情况吗? 我复制功能吗?

Edit: My apologies for not stating up front that I'm using this code on Mono version 2.4.2.

88631 次浏览

If you're using .NET 3.5, it's easy:

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();
}
}

只是为了好玩,@JonSkeet 的 回答作为一种扩展方法:

/// <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();
}

您也可以使用其他方法

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;
}
}

包含在.NET 4: 数不胜数

public static bool ContainsAll<T>(IEnumerable<T> source, IEnumerable<T> values)
{
return values.All(value => source.Contains(value));
}

我知道一种使用 LinQ 方法的方法,读起来有点奇怪,但是很好用

var motherList = new List<string> { "Hello", "World", "User };
var sonList = new List<string> { "Hello", "User" };

您想检查 sonList 是否完全在 Mother List 中

这样做:

sonList.All(str => moterList.Any(word => word == str));


// Reading literally, would be like "For each of all items
// in sonList, test if it's in motherList

请检查一下,看看是否也有效。希望能有所帮助; -)