C# 如何删除所有正确的子集?
给定一个集合列表C# 如何删除所有正确的子集?,c#,hashset,subset,C#,Hashset,Subset,给定一个集合列表 var sets = new List<HashSet<int>>(numTags); var集=新列表(numTags); 如何删除属于另一个集合的适当子集的所有集合 这是最好的方法吗 for (int i = 0; i < sets.Count; ++i) { for (int j = 0; j < sets.Count; ++j) { if (i != j && sets[i].IsP
var sets = new List<HashSet<int>>(numTags);
var集=新列表(numTags);
如何删除属于另一个集合的适当子集的所有集合
这是最好的方法吗
for (int i = 0; i < sets.Count; ++i)
{
for (int j = 0; j < sets.Count; ++j)
{
if (i != j && sets[i].IsProperSubsetOf(sets[j]))
{
sets.RemoveAt(i--);
}
}
}
for(int i=0;i
我正在减小I
,因为我假设所有的东西在被移除后都会被轻推一次,所以我必须再次检查这个插槽
var toRemove = sets.Where(s => sets.Any(superset => s.IsProperSubsetOf(superset))).ToList();
foreach (var s in toRemove)
sets.Remove(s);
您不需要s!=超集
检查,因为没有一个集是其自身的正确子集。
您不需要s!=超集
检查,因为没有一个集是其自身的正确子集。
更好的方法是使用
RemoveAll
<代码>集合.RemoveAll(子集=>集合.Any(超集=>子集!=超集和子集.IsSubsetOf(超集))代码>谢谢!不我知道,但我改变了主意,我确实想要一个常规的旧子集;)最好使用RemoveAll
<代码>集合.RemoveAll(子集=>集合.Any(超集=>子集!=超集和子集.IsSubsetOf(超集))代码>谢谢!不我知道,但我改变了主意,我确实想要一个常规的旧子集;)我将获取一个要删除的索引集合,而不是在遍历集合时从集合中删除项。然后,在遍历之后,按索引删除。这种方法效率稍低,但也不太可能引起意外的副作用。@Jim:听起来很合理,但我们可以证明它是否真的有副作用,然后就不用担心了?而不是回避这个问题。不管怎样,这个和Grozz的解决方案在实践中似乎都非常有效。非常确定RemoveAll
就是在考虑到这一点的情况下构建的。我不会在迭代集合时从集合中删除项,而是获取要删除的索引集合。然后,在遍历之后,按索引删除。这种方法效率稍低,但也不太可能引起意外的副作用。@Jim:听起来很合理,但我们可以证明它是否真的有副作用,然后就不用担心了?而不是回避这个问题。不管怎样,这个和Grozz的解决方案在实践中似乎都非常有效。可以肯定的是,RemoveAll
就是基于这一点构建的。