ICollection - 检查一个集合是否包含对象
了解非通用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