如何从循环中的int的HashSet列表中删除项目

时间:2016-03-08 12:47:47

标签: c#

我有以下列表:

        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);
                }

            }
        }

2 个答案:

答案 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实际上会引用错误的位置(可能超出列表的新长度)。