Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何删除列表中的嵌套(子)项<&燃气轮机;使用Linq?_C#_.net_Linq_Removeall - Fatal编程技术网

C# 如何删除列表中的嵌套(子)项<&燃气轮机;使用Linq?

C# 如何删除列表中的嵌套(子)项<&燃气轮机;使用Linq?,c#,.net,linq,removeall,C#,.net,Linq,Removeall,我有一个简单的清单 var menu = new List<MenuItem> { new MenuItem { text = "Sign In", icon = "fas fa-sign-in-alt", }, new MenuItem { text = "Sign Out", icon = "fas fa-s

我有一个简单的清单

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"
            }
        }

    }

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

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

但通过使用RemoveAll,我无法删除嵌套元素,因此我的列表仍然包含“Workers”。是否有一种简单的方法可以使用LINQ删除列表中的嵌套/子元素?谢谢你的帮助

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

您可以做的是递归地选择要保留的
MenuItem
s:

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;
    }
}

请注意,这将创建一个新的
列表
,而不是更新现有的
列表

属性是一个数组,不能从数组中删除项

您可以做的是递归地选择要保留的
MenuItem
s:

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;
    }
}

请注意,这将创建一个新的
列表
,而不是更新现有的
列表

,您可能需要在此处使用递归。一种“简单”的方法?不支持。LINQ不支持开箱即用的分层查询/递归。可能您需要在这里使用递归。一种“简单”的方法?不支持。LINQ不支持开箱即用的分层查询/递归。
menu = menu.RecursiveSelect(x => !nameToRemove.Contains(x.text)).ToList();