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