C# 如何删除递归嵌套列表中的重复项

C# 如何删除递归嵌套列表中的重复项,c#,list,linq,recursion,C#,List,Linq,Recursion,下面是我试图实现的代码示例: int counter = 0; var services = new List<Service> { new Service {Id = ++counter, Code = "SG1", Services = new List<Service> { new Service {Id = ++counter, Code = "S1"}, new Service {Id = ++counter, C

下面是我试图实现的代码示例:

int counter = 0;
var services = new List<Service>
{
    new Service {Id = ++counter, Code = "SG1", Services = new List<Service>
    {
        new Service {Id = ++counter, Code = "S1"},
        new Service {Id = ++counter, Code = "S2"},
        new Service {Id = ++counter, Code = "S3"},
        new Service {Id = ++counter, Code = "S4"},
        new Service {Id = ++counter, Code = "S5"},
        new Service {Id = ++counter, Code = "SG2", 
        Services = new List<Service>
        {
            new Service {Id = ++counter, Code = "S3"},
            new Service {Id = ++counter, Code = "S4"},
            new Service {Id = ++counter, Code = "S5"},
            new Service {Id = ++counter,Code = "SG3", 
            Services = new List<Service>
            {
                new Service {Id = ++counter, Code = "S3"},
                new Service {Id = ++counter, Code = "S4"},
            }
        }
    }
}
}

}
};
int计数器=0;
var服务=新列表
{
新服务{Id=++计数器,Code=“SG1”,服务=新列表
{
新服务{Id=++计数器,Code=“S1”},
新服务{Id=++计数器,Code=“S2”},
新服务{Id=++计数器,Code=“S3”},
新服务{Id=++计数器,Code=“S4”},
新服务{Id=++计数器,Code=“S5”},
新服务{Id=++计数器,Code=“SG2”,
服务=新列表
{
新服务{Id=++计数器,Code=“S3”},
新服务{Id=++计数器,Code=“S4”},
新服务{Id=++计数器,Code=“S5”},
新服务{Id=++计数器,Code=“SG3”,
服务=新列表
{
新服务{Id=++计数器,Code=“S3”},
新服务{Id=++计数器,Code=“S4”},
}
}
}
}
}
}
};
我需要从中得到的输出如下:

  • 如果子列表包含父列表中存在的项(相同代码),请将其从父列表中删除。递归地处理每个服务,直到最终结果如下:
SG1-->S1-->S2-->SG1------>S5------>SG3

---------->S3------>S4

使用深度优先遍历。你不需要LINQ

下面是一些伪代码,让您了解如何做到这一点:

public static void RemoveDuplicates(Service service) {
    var toRemove = new HashSet<string>();
    RemoveDuplicates(service, toRemove);
}
private static void RemoveDuplicates(Service service, ISet<string> toRemove) {
    // Collect all child codes, and clean up children in the process
    foreach (var child in services) {
        RemoveDuplicates(child, toRemove);
    }
    // Remove all child codes from self
    foreach (var code in toRemove) {
        service.RemoveCode(code);
    }
    // Add the remaining codes for my parents to remove
    foreach (var myCode in allMyCodes) {
        toRemove.Add(myCode);
    }
}
公共静态无效删除副本(服务){
var toRemove=newhashset();
移除的副本(服务、移除);
}
移除私有静态无效副本(服务,ISet toRemove){
//收集所有子代码,并清理过程中的子代码
foreach(服务中的var子项){
移除的副本(子副本、移除副本);
}
//从self中删除所有子代码
foreach(toRemove中的var代码){
服务。删除代码(代码);
}
//添加剩余代码,以便我的父母删除
foreach(所有mycodes中的var myCode){
toRemove.Add(myCode);
}
}