从列表中删除子集和重复项?

时间:2016-02-19 21:47:18

标签: c#

我有一个对象列表。每个对象都有一个名为Conflicts的属性,它是一个int的HashSet。

我想删除任何属于正确子集的集合,如果散列集包含相同的整数,还要删除任何重复的集合:

private static List<ConflictGroup> RemoveSubsets(List<ConflictGroup> groups)
{
    List<ConflictGroup> results = new List<ConflictGroup>();
    foreach (var group in groups)
    {
        results.RemoveAll(r => r.Conflicts.SetEquals(group.Conflicts));
        results.RemoveAll(r => r.Conflicts.IsProperSubsetOf(group.Conflicts));
        results.Add(group);
    }
    return results;
}

这几乎可行。

如果我有:

1
1,2
1,2,3

它只保留1,2,3。

但如果我有:

1,
1,2,3
1,2

失败并且不仅仅返回1,2,3 ......

我不确定我应该做些什么来改变它。

2 个答案:

答案 0 :(得分:1)

我认为它会返回最后两行?

代码通过,删除所有EXISTING子集,然后添加当前的子集。如果THAT ONE不是已经存在的任何一个子集,它应该只添加当前的那个。

会发生什么:

  • 流程{1} - 未删除,请添加{1}
  • 流程{1,2,3} - 删除1({1,2,3}的正确子集),添加{1,2,3}
  • 流程{1,2} - 未删除({1,2,3}不是{1,2}的子集),添加{1,2}

答案 1 :(得分:1)

如果新添加组是添加之前存在的某些子集,只需添加测试:

if(results.Any(r => group.Conflicts.IsProperSubsetOf(r.Conflicts))){ continue; }

你甚至可以在那些RemoveAll之前测试它,好像它是某个现有组的子集,无论如何结果中都没有这个子集的子集(同样代表相等)。