如何使用 Linq 删除 List<> 中的嵌套(子)项?
How to remove nested(child) items in List<> using Linq?
我有一个简单的列表。
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 我无法删除嵌套元素,所以我的列表仍然包含“Workers”。有没有一种简单的方法可以使用 LINQ 删除列表中的 nested/child 元素?感谢您的帮助!
items
属性 是一个数组,您不能从数组中删除项目。
您可以做的是递归地 select 您想要保留的 MenuItem
:
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
。
我有一个简单的列表。
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 我无法删除嵌套元素,所以我的列表仍然包含“Workers”。有没有一种简单的方法可以使用 LINQ 删除列表中的 nested/child 元素?感谢您的帮助!
items
属性 是一个数组,您不能从数组中删除项目。
您可以做的是递归地 select 您想要保留的 MenuItem
:
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
。