Проверить значение свойства во вложенном списке с неизвестными уровнями - PullRequest
0 голосов
/ 23 октября 2018

У меня есть вложенное меню - здесь упрощенный класс:

public class NestedNode
{
    public string Url { get; set; }
    public List<NestedNode> Children { get; set; }
}

Учитывая, что у меня есть рекурсивный список NestedNode, я пытаюсь выяснить, активен ли какой-либо потомок на каком-либо уровне.

Вот код для проверки:

protected void Page_Load(object sender, EventArgs e)
{
    // The url of the current page
    var currentUrl = Request.Url.GetLeftPart(UriPartial.Path);

    // This is a list of nested nodes
    var nodes = SiloNodes;

    // Start loop
    RecursiveCall(nodes, currentUrl);
}

void RecursiveCall(IEnumerable<NestedNode> nodes, string currentUrl)
{
    if (nodes == null) return;

    foreach (var n in nodes)
    {
            // This can test current level only
            //var isActive = n.Url == currentUrl;

            // This can test next level down
            //var isActive = n.Children.Any(c => c.Url == currentUrl);

            // How can I test all levels in one go?

            RecursiveCall(n.Children, currentUrl);
    }
}

Мне нужно уметь работать, если кто-то из родителей активен (на верхнем уровне), чтобы я могдобавить классы.На данный момент мои идеи углубляются только на один уровень.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Как насчет чего-то вроде

void Main()
{
    var nodes = new List<NestedNode>();

    var isActive = nodes.Any(n => n.AnyActive("url"));
}

public class NestedNode
{
    public NestedNode()
    {
        Children = Enumerable.Empty<NestedNode>();
    }
    public string Url { get; set; }
    public IEnumerable<NestedNode> Children { get; set; }

    public bool AnyActive(string url){ return Url==url || Children.Any(c => c.AnyActive(url));}
}
0 голосов
/ 23 октября 2018

В этой ситуации я бы, вероятно, добавил бы метод к NestedNode для рекурсивной проверки состояния - что-то вроде этого:

public bool ExistsRecursive(Func<NestedNode, bool> predicate)
{
    if(predicate(this))
    {
        return true;
    }
    foreach(var node in Children)
    {
        return predicate(node);
    }
    return false;
}

И затем, в вашем Page_Load, все, что вам нужно, это:

if(nodes.ExistsRecursive(n => n.Url == currentUrl))
{
    // current url is found in at least one node
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...