【问题标题】:How to remove nested(child) items in List<> using Linq?如何使用 Linq 删除 List<> 中的嵌套(子)项?
【发布时间】:2021-03-06 05:15:36
【问题描述】:

我有一个简单的清单。

var menu = new List<MenuItem>
{
    new MenuItem
    {
        text = "Sign In",
        icon = "fas fa-sign-in-alt",
    },
    new MenuItem
    {
        text = "Sign Out",
        icon = "fas fa-sign-out-alt",

    },
    new MenuItem
    {
        text = "Tests",
        icon = "fas fa-sign-out-alt",

    },
    new MenuItem
    {
        text = "Data",
        icon = "far fa-border-outer",
        items = new[]
        {
            new MenuItem
            {
                text = "Asset",
                icon = "far fa-copy",
            },
            new MenuItem
            {
                text = "Tasks",
                icon = "far fa-tasks"
            },
            new MenuItem
            {
                text = "Workers",
                icon = "far fa-user-friends"
            }
        }

    }

};    

我想从列表中删除一些元素。所以我有一个包含要删除元素的数组:

var nameToRemove = new[] 
{ 
    "Sign In", 
    "Sign Out",
    "Workers" 
};

现在我可以使用 RemoveAll 删除列表中的包含元素。

 menu.RemoveAll(x => nameToRemove.Contains(x.text));

但是通过使用 RemoveAll 我不能删除嵌套元素,所以我的列表仍然包含“工人”。有没有一种简单的方法可以使用 LINQ 删除列表中的嵌套/子元素?感谢您的帮助!

【问题讨论】:

  • 这里可能需要用到递归。
  • 一种“简单”的方式?不。LINQ 不支持开箱即用的分层查询/递归。

标签: c# .net linq removeall


【解决方案1】:

items 属性是一个数组,您不能从数组中删除项目。

你可以做的是递归地选择你想要保留的MenuItems:

static IEnumerable<MenuItem> RecursiveSelect(this IEnumerable<MenuItem> items,
    Func<MenuItem, bool> keep)
{
    foreach (var item in items)
    {
        item.items = item.items?.RecursiveSelect(keep).ToArray();
        if (keep(item)) yield return item;
    }
}

然后像这样使用:

menu = menu.RecursiveSelect(x => !nameToRemove.Contains(x.text)).ToList();

请注意,这会创建一个新的List,而不是更新现有的List

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2019-02-05
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    相关资源
    最近更新 更多