[英]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.