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作为属性