遍历带有子节点的IEnumerable <T>以查找特定条目

adv*_*api 1 c#

在mvc应用程序中,我有一个由以下结构组成的菜单

public class MenuItem
{
    public string Action {get;set;}
    public string Controller {get;set;}
    public string Text {get;set;}
    public List<MenuItem> Children {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

考虑一个简单的compisition

Root
\-Item1
\-Item2
  \-Item2_1
  \-Item2_2
    \-Item_2_2_1
    \-Item_2_2_2
\-Item3
Run Code Online (Sandbox Code Playgroud)

我想获取项目Item_2_2_2(认为它有Action ="Index",Controller ="ABC")

我如何编写一个函数(或更好的T的扩展方法)来迭代收集并获得与该条件匹配的项目?

谢谢

Axe*_*eer 6

您可以编写一个扩展方法来"展平"层次结构......

public static IEnumerable<T> Flatten<T>(this T value, Func<T, IEnumerable<T>> inner) {
    foreach (var i in inner(value)) {
        foreach (var j in Flatten(i, inner)) {
            yield return j;
        }
    }
    yield return value;
}
Run Code Online (Sandbox Code Playgroud)

...然后使用普通的LINQ:

items.Flatten(i => i.Children).Where(i => ...
Run Code Online (Sandbox Code Playgroud)