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