Dog*_*mir 1 c# traversal list removechild
我有以下课程
public class Item
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Content { get; set; }
public bool IsLastItem { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
假设我有以下型号,我想删除IsLastItem = false没有孩子的物品.在此方案中,item4和item7应从列表中删除.
我从数据库中获取了我的模型列表,并在代码块中模拟了它
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
}
};
Run Code Online (Sandbox Code Playgroud)
像这样的平面列表对于这些类型的操作来说并不是最佳的 - 如果你可以将列表恢复到某种树形结构(FOR XML如果你是2016年,可以从SQL使用或JSON 返回它),这可能会很好,你可以更轻松地穿越树.
另请注意,您的示例数据不是设置IsLastItem ...
按原样,你必须至少迭代两次,如下所示:
items.RemoveAll(x => x.IsLastItem == false &&
items.Any(y => y.ParentId == x.Id) == false);
Run Code Online (Sandbox Code Playgroud)
您要删除所有IsLastItem错误的项目以及至少没有一个项目的父项ID为该项目的ID的项目.