Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何删除所有正确的子集?_C#_Hashset_Subset - Fatal编程技术网

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
就是基于这一点构建的。