喜欢 SLaks 版本。为了完整起见,您可以在执行集合操作时使用HashSet
方法IsSubsetOfIsSupersetOf
(也检查方法)。这种方法有利有弊。下一个代码显示了一个示例:
var list1 = new HashSet<string>{ "Dog", "Cat", "Bird" };
var list2 = new HashSet<string>{ "Dog", "Cat" };
if (list2.IsSubsetOf(list1))
{
Console.Write("All items in list2 are in list1");
}
Except
方法本质上是流式传输。In 查询list2.Except(list1)
list1
完全缓冲到内存中,并且您一次通过list2
. IsSubsetOf
以相反的方式热切地工作。当您拥有大量数据时,这开始产生影响。
为了分析最坏情况下的性能,这里是Monos EnumerableExcept
的一些实现代码(dotPeek 给出了非常相似的结果,只是可读性较差)
var items = new HashSet<TSource> (second, comparer); //list1.Count
foreach (var element in first) //list2.Count
if (items.Add (element)) //constant time
yield return element;
结果O(list1.Count + list2.Count)
,循环不是嵌套的。
IsSubset
有下一个方法调用,如果 secondIEnumerable
是HashSet
(通过 dotPeek 反编译):
private bool IsSubsetOfHashSetWithSameEC(HashSet<T> other)
{
foreach (T obj in this) //list2.Count
if (!other.Contains(obj)) //constant time
return false;
return true;
}
导致O(list2.Count)
iflist1
是一个HashSet
.