2017-03-15 190 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:好的提示! –

相关问题