繁体   English   中英

使用递归Func委托遍历Tree结构时的Stackoverflow

[英]Stackoverflow while traversing Tree structure using recursive Func delegate

我试图遍历定义如下的树结构

public class TreeItem
{
    string _Name;
    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

    bool _IsChecked;
    public bool IsChecked
    {
        get { return _IsChecked; }
        set { _IsChecked = value; }
    }

    Visibility _CheckBoxVisibility;
    public Visibility CheckBoxVisibility
    {
        get { return _CheckBoxVisibility; }
        set { _CheckBoxVisibility = value; }
    }

    Visibility _ImageVisibility;
    public Visibility ImageVisibility
    {
        get { return _ImageVisibility; }
        set { _ImageVisibility = value; }
    }

    List<TreeItem> _Children;
    public List<TreeItem> Children
    {
        get { return _Children; }
        set { _Children = value; }
    }

    public TreeItem()
    {
        Children = new List<TreeItem>();
        IsChecked = true;
        CheckBoxVisibility = Visibility.Collapsed;
    }

    public TreeItem(TreeItem t)
    {
        Children = t.Children;
        Name = t.Name;
    }

    public void AddChild(TreeItem _Child)
    {
        Children.Add(_Child);
    }

}

功能代表声明

Func<TreeItem, TreeItem> Traverse = null;
Traverse = (t) => (t.Children.Count == 0) ? t : Traverse(t) ;

但是,当我调用它时,会给出一个stackoverflow的概念,我知道这是由于再次将t传递给Travese导致了无限循环。 我想要一个解决方案,通过该解决方案我可以将Children属性而不是整个类对象传递给Travese。

我认为可以做到:

Traverse = (t) => (t.Children.Count == 0) ? t : Traverse(t.Children[0]) ;
Traverse = t => t.Children.ForEach(Traverse);

如果在根上使用,它将遍历整个树。 它不会有任何返回值。 您可以检查的可能方式:

TraverseAndCheckIfAnyIsChecked = t => t.IsChecked || t.Children.Any(TraverseAndCheckIfAnyIsChecked);


TraverseAndCheckIfAllAreChecked = t => t.IsChecked && t.Children.All(TraverseAndCheckIfAallAreChecked);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM