Loved SLaks版本。为了完整,您可以在执行设置操作时使用HashSet
方法IsSubsetOf(同时检查IsSupersetOf
方法)。这种方法有利有弊。下面的代码显示了一个示例:
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
方法本质上是流式传输。在查询list2.Except(list1)
中list1
被完全缓冲到内存中,并且通过list2
一次迭代一个项目。 IsSubsetOf
热切地以相反的方式工作。当你有大量的数据时,这会开始有所作为。
分析最坏情况下的性能,下面是Except
实现在Monos Enumerable一些代码(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
具有下一个方法调用,如果第二IEnumerable
是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)
得到的IF list1
是HashSet
。
好讨论这个http://stackoverflow.com/questions/332973/linq-check-whether-an-array-另一个是@leora的子集 – ojhawkins