C#如何从列表中删除特定节点

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)

Dan*_*eld 5

像这样的平面列表对于这些类型的操作来说并不是最佳的 - 如果你可以将列表恢复到某种树形结构(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的项目.