C#如何从列表中删除特定节点
我有以下课程C#如何从列表中删除特定节点,c#,list,traversal,removechild,C#,List,Traversal,Removechild,我有以下课程 public class Item { public int Id { get; set; } public int ParentId { get; set; } public string Content { get; set; } public bool IsLastItem { get; set; } } 假设我有以下模型,我想删除IsLastItem=false且没有子项的项目。在这种情况下,应该从列表中删除项目4和项目7 我从数据库中得
public class Item
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Content { get; set; }
public bool IsLastItem { get; set; }
}
假设我有以下模型,我想删除IsLastItem=false
且没有子项的项目。在这种情况下,应该从列表中删除项目4和项目7
我从数据库中得到了我的模型列表,并在代码块中模拟了它,如下所示
var items = new List<Item>
{
new Item
{
Id = 1,
ParentId = 0,
Content = "item1",
IsLastItem = false
},
new Item
{
Id = 2,
ParentId = 1,
Content = "item2",
IsLastItem = false
},
new Item
{
Id = 3,
ParentId = 1,
Content = "item3",
IsLastItem = true
},
new Item
{
Id = 4,
ParentId = 1,
Content = "item4",
IsLastItem = false
},
new Item
{
Id = 5,
ParentId = 2,
Content = "item5",
IsLastItem = false
},
new Item
{
Id = 6,
ParentId = 5,
Content = "item6",
IsLastItem = false
},
new Item
{
Id = 7,
ParentId = 5,
Content = "item7",
IsLastItem = false
},
new Item
{
Id = 8,
ParentId = 6,
Content = "item8",
IsLastItem = true
},
new Item
{
Id = 9,
ParentId = 8,
Content = "item9",
IsLastItem = true
}
};
var items=新列表
{
新项目
{
Id=1,
ParentId=0,
Content=“item1”,
IsLastItem=false
},
新项目
{
Id=2,
ParentId=1,
Content=“item2”,
IsLastItem=false
},
新项目
{
Id=3,
ParentId=1,
Content=“item3”,
IsLastItem=true
},
新项目
{
Id=4,
ParentId=1,
Content=“item4”,
IsLastItem=false
},
新项目
{
Id=5,
ParentId=2,
Content=“item5”,
IsLastItem=false
},
新项目
{
Id=6,
ParentId=5,
Content=“item6”,
IsLastItem=false
},
新项目
{
Id=7,
ParentId=5,
Content=“item7”,
IsLastItem=false
},
新项目
{
Id=8,
ParentId=6,
Content=“item8”,
IsLastItem=true
},
新项目
{
Id=9,
ParentId=8,
Content=“item9”,
IsLastItem=true
}
};
您忘记在模拟数据中设置IsLastItem,仅供参考。您应该能够通过RemoveAll
来完成这一点
public static void Main()
{
var items = init();
items.RemoveAll(x => !items.Any(y => y.ParentId == x.Id) == true && x.IsLastItem == false);
}
public static List<Item> init()
{
return new List<Item>
{
new Item
{
Id = 1,
ParentId = 0,
Content = "item1"
},
new Item
{
Id = 2,
ParentId = 1,
Content = "item2"
},
new Item
{
Id = 3,
ParentId = 1,
Content = "item3",
IsLastItem = true
},
new Item
{
Id = 4,
ParentId = 1,
Content = "item4"
},
new Item
{
Id = 5,
ParentId = 2,
Content = "item5"
},
new Item
{
Id = 6,
ParentId = 5,
Content = "item6"
},
new Item
{
Id = 7,
ParentId = 5,
Content = "item7"
},
new Item
{
Id = 8,
ParentId = 6,
Content = "item8"
},
new Item
{
Id = 9,
ParentId = 8,
Content = "item9",
IsLastItem = true
}
};
}
publicstaticvoidmain()
{
var items=init();
items.RemoveAll(x=>!items.Any(y=>y.ParentId==x.Id)==true&&x.IsLastItem==false);
}
公共静态列表init()
{
返回新列表
{
新项目
{
Id=1,
ParentId=0,
Content=“item1”
},
新项目
{
Id=2,
ParentId=1,
Content=“item2”
},
新项目
{
Id=3,
ParentId=1,
Content=“item3”,
IsLastItem=true
},
新项目
{
Id=4,
ParentId=1,
Content=“item4”
},
新项目
{
Id=5,
ParentId=2,
Content=“item5”
},
新项目
{
Id=6,
ParentId=5,
Content=“item6”
},
新项目
{
Id=7,
ParentId=5,
Content=“item7”
},
新项目
{
Id=8,
ParentId=6,
Content=“item8”
},
新项目
{
Id=9,
ParentId=8,
Content=“item9”,
IsLastItem=true
}
};
}
您忘记在模拟数据中设置IsLastItem,仅供参考。您应该能够通过RemoveAll
来完成这一点
public static void Main()
{
var items = init();
items.RemoveAll(x => !items.Any(y => y.ParentId == x.Id) == true && x.IsLastItem == false);
}
public static List<Item> init()
{
return new List<Item>
{
new Item
{
Id = 1,
ParentId = 0,
Content = "item1"
},
new Item
{
Id = 2,
ParentId = 1,
Content = "item2"
},
new Item
{
Id = 3,
ParentId = 1,
Content = "item3",
IsLastItem = true
},
new Item
{
Id = 4,
ParentId = 1,
Content = "item4"
},
new Item
{
Id = 5,
ParentId = 2,
Content = "item5"
},
new Item
{
Id = 6,
ParentId = 5,
Content = "item6"
},
new Item
{
Id = 7,
ParentId = 5,
Content = "item7"
},
new Item
{
Id = 8,
ParentId = 6,
Content = "item8"
},
new Item
{
Id = 9,
ParentId = 8,
Content = "item9",
IsLastItem = true
}
};
}
publicstaticvoidmain()
{
var items=init();
items.RemoveAll(x=>!items.Any(y=>y.ParentId==x.Id)==true&&x.IsLastItem==false);
}
公共静态列表init()
{
返回新列表
{
新项目
{
Id=1,
ParentId=0,
Content=“item1”
},
新项目
{
Id=2,
ParentId=1,
Content=“item2”
},
新项目
{
Id=3,
ParentId=1,
Content=“item3”,
IsLastItem=true
},
新项目
{
Id=4,
ParentId=1,
Content=“item4”
},
新项目
{
Id=5,
ParentId=2,
Content=“item5”
},
新项目
{
Id=6,
ParentId=5,
Content=“item6”
},
新项目
{
Id=7,
ParentId=5,
Content=“item7”
},
新项目
{
Id=8,
ParentId=6,
Content=“item8”
},
新项目
{
Id=9,
ParentId=8,
Content=“item9”,
IsLastItem=true
}
};
}
像这样的平面列表对于这些类型的操作来说并不是最优的-如果您可以以某种树结构(可能使用XML的或JSON从SQL返回列表,如果您在2016年),这样您就可以更轻松地遍历树,这可能会更好
还要注意的是,您的示例数据没有设置IsLastItem
实际上,您必须至少迭代两次,如下所示:
items.RemoveAll(x => x.IsLastItem == false &&
items.Any(y => y.ParentId == x.Id) == false);
List<Item> RemoveNodes(List<Item> tree)
{
var ret = tree.Where(item => !item.IsLastItem);
foreach (Item item in ret)
{
item.SubItems = RemoveNodes(item.SubItems);
}
return ret;
}
您的意思是删除所有IsLastItem为false且至少没有一个项的父id为该项id的项。这样的平面列表对于这些类型的操作不是最佳的-如果您可以以某种树结构获取列表,这可能会很好(如果您在2016年,可以使用FOR XML
或JSON从SQL返回),这样可以更轻松地遍历树
还要注意的是,您的示例数据没有设置IsLastItem
实际上,您必须至少迭代两次,如下所示:
items.RemoveAll(x => x.IsLastItem == false &&
items.Any(y => y.ParentId == x.Id) == false);
List<Item> RemoveNodes(List<Item> tree)
{
var ret = tree.Where(item => !item.IsLastItem);
foreach (Item item in ret)
{
item.SubItems = RemoveNodes(item.SubItems);
}
return ret;
}
您的意思是删除所有IsLastItem
为false且至少没有一个项目的父id是该项目的id的项目。查找ParentId。将每个项目与ParentId集合列表进行比较,然后选中IsLastItem
var parents = items.Select(x => x.ParentId);
items.RemoveAll(x => !parents.Contains(x.Id) && !x.IsLastItem);
查找ParentId。将每个项与ParentId集合列表进行比较,然后选中IsLastitem
var parents = items.Select(x => x.ParentId);
items.RemoveAll(x => !parents.Contains(x.Id) && !x.IsLastItem);
我建议您使用树状结构,并将IsLastItem作为属性