我有以下列表:
var set = new List<HashSet<int>>()
{
new HashSet<int>() { 1,2,3,4},
new HashSet<int>() { 1,2,3,5},
new HashSet<int>() { 1,2,4,5},
new HashSet<int>() {2,3,4,5}
};
var subSet = new List<HashSet<int>>()
{
new HashSet<int>() { 1,2,3},
new HashSet<int>() { 1,2,4},
};
我想从set中删除subSet.Count()项,它们是isProperSubSet,结果必须是:
var result= new List<HashSet<int>>()
{
new HashSet<int>() { 1,2,3,5},
new HashSet<int>() {2,3,4,5}
};
我该怎么办?
我试过这样,但是我得到一个索引错误(必须是非负数且少于集合):
for(int j=set.Count-1;j-->0;)
{
for (int i = subSet.Count-1;i-->0;)
{
if (subSet[i].IsProperSubsetOf(set[j]))
{
subSet.RemoveAt(i);
set.RemoveAt(j);
}
}
}
答案 0 :(得分:0)
首先,您不应删除subSet
中的元素或set
的其他元素,这些元素的子集不是正确的subSet
。
其次,juharr说,你必须在if:
中添加一个休息时间for(int j=set.Count-1;j-->0;)
{
for (int i = subSet.Count-1;i-->0;)
{
if (subSet[i].IsProperSubsetOf(set[j]))
{
set.RemoveAt(j);
break;
}
}
}
答案 1 :(得分:0)
基本上,一旦从set
中删除值,就需要突破内循环。
for(int j=set.Count-1; j >= 0; j--)
{
for (int i = subSet.Count-1; i >= 0; i--)
{
if (subSet[i].IsProperSubsetOf(set[j]))
{
subSet.RemoveAt(i);
set.RemoveAt(j);
break;
}
}
}
那是因为您可能仍在迭代内循环,现在您的j
实际上会引用错误的位置(可能超出列表的新长度)。