2017-03-15 149 views
-2

瞭解非通用ICollection不提供Contains方法,檢查給定對象是否已經在集合中的最佳方法是什麼?ICollection - 檢查一個集合是否包含對象

如果我有兩個ICollections:A和B,並且想要檢查B是否具有A的所有元素,那麼最好的方法是什麼?我的第一個想法是將A的所有元素添加到HashSet,然後使用Contains檢查是否所有B的元素都在集合中。

+2

Cast-> ToList->包含 – Nkosi

+0

@Nkosi你或許應該把它放在一個答案,所以他可以關閉這個問題:) – CNuts

+0

'我首先想到的是添加的所有元素到HashSet,然後檢查是否所有B的元素在使用Contains的集合中。「那麼當你嘗試這樣做時發生了什麼? – Servy

回答

-2
Boolean ICollectionContains(ICollection collection, Object item) 
{ 
    for (Object o in collection) 
    { 
     if (o == item) 
     return true; 
    } 
    return false; 
} 

還是在擴展形式:

public static class CollectionExtensions 
{ 
    public static Boolean Contains(this ICollection collection, Object item) 
    { 
     for (Object o in collection) 
     { 
     if (o == item) 
      return true; 
     } 
     return false; 
    } 
} 

的使用方式:

ICollection turboEncabulators = GetSomeTrunnions(); 

if (turboEncabulators.Contains(me)) 
    Environment.FailFast(); //How did you find me! 
+0

這隻使用引用相等,如果你想這樣做,你可能只需使用'collection.Cast ().Any(o => o == item)'。 – Lee

0

A和B,並要檢查是否B具有的

所有元素

我認爲你有倒退。將B添加到HashSet。

HashSet.Contains是O(1)
整體而言,這將是O(N + M)

將假設字符串

HashSet<string> HashSetB = new HashSet<string>(iCollecionB); 
    foreach (string s in iCollecionA) 
    { 
     if(HashSetB.Contains(s)) 
     { 
     } 
     else 
     { 
     } 
    } 
3

如果我有兩個ICollectionsAB和想要檢查B是否具有A的所有元素,那麼完成該操作的最佳方法是什麼?

讓我用套的語言來重述您的問題。

如果我有兩套AB,想檢查是否AB一個子集,這將是實現這個的最佳方式?

現在就很容易看到答案:

https://msdn.microsoft.com/en-us/library/bb358446%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

A構建HashSet<T>,然後使用IsSubsetOf方法,看看是否AB一個子集。

我注意到,如果這些操作是你必須頻繁執行的操作,那麼你應該保留你的數據開始於HashSet<T>集合。如果兩個集合都是哈希集合,則IsSubsetOf操作可能更有效。

+2

當兩個集合都是'HashSet'集合時,獲得性能增益的主要原因是它使「Contains」查詢在同一時間運行。如果您調用'B.IsSupersetOf(A)'而不是'A.IsSubsetOf(B)',則可以在不從'A'構建'HashSet'的情況下獲得此性能。 – Brian

+0

@Brian:好的提示! –

相關問題