瞭解非通用ICollection不提供Contains
方法,檢查給定對象是否已經在集合中的最佳方法是什麼?ICollection - 檢查一個集合是否包含對象
如果我有兩個ICollections
:A和B,並且想要檢查B是否具有A的所有元素,那麼最好的方法是什麼?我的第一個想法是將A的所有元素添加到HashSet,然後使用Contains
檢查是否所有B的元素都在集合中。
瞭解非通用ICollection不提供Contains
方法,檢查給定對象是否已經在集合中的最佳方法是什麼?ICollection - 檢查一個集合是否包含對象
如果我有兩個ICollections
:A和B,並且想要檢查B是否具有A的所有元素,那麼最好的方法是什麼?我的第一個想法是將A的所有元素添加到HashSet,然後使用Contains
檢查是否所有B的元素都在集合中。
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!
這隻使用引用相等,如果你想這樣做,你可能只需使用'collection.Cast
所有元素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
{
}
}
如果我有兩個
ICollections
A
和B
和想要檢查B
是否具有A
的所有元素,那麼完成該操作的最佳方法是什麼?
讓我用套的語言來重述您的問題。
如果我有兩套
A
和B
,想檢查是否A
是B
一個子集,這將是實現這個的最佳方式?
現在就很容易看到答案:
https://msdn.microsoft.com/en-us/library/bb358446%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
從A
構建HashSet<T>
,然後使用IsSubsetOf
方法,看看是否A
是B
一個子集。
我注意到,如果這些操作是你必須頻繁執行的操作,那麼你應該保留你的數據開始於HashSet<T>
集合。如果兩個集合都是哈希集合,則IsSubsetOf
操作可能更有效。
當兩個集合都是'HashSet'集合時,獲得性能增益的主要原因是它使「Contains」查詢在同一時間運行。如果您調用'B.IsSupersetOf(A)'而不是'A.IsSubsetOf(B)',則可以在不從'A'構建'HashSet'的情況下獲得此性能。 – Brian
@Brian:好的提示! –
Cast-> ToList->包含 – Nkosi
@Nkosi你或許應該把它放在一個答案,所以他可以關閉這個問題:) – CNuts
'我首先想到的是添加的所有元素到HashSet,然後檢查是否所有B的元素在使用Contains的集合中。「那麼當你嘗試這樣做時發生了什麼? – Servy