Рейтинг:
2
Richard Deeming
Вот общий метод расширения для итерации всех узлов в любой Иерархии:
private static IEnumerable<T> SelectRecursiveIterator<T>(IEnumerable<T> source, Func<T, IEnumerable<T>> getChildren)
{
var stack = new Stack<IEnumerator<T>>();
try
{
stack.Push(source.GetEnumerator());
while (stack.Count != 0)
{
IEnumerator<T> iter = stack.Peek();
if (iter.MoveNext())
{
T current = iter.Current;
yield return current;
IEnumerable<T> children = getChildren(current);
if (children != null) stack.Push(children.GetEnumerator());
}
else
{
iter.Dispose();
stack.Pop();
}
}
}
finally
{
while (stack.Count != 0)
{
stack.Pop().Dispose();
}
}
}
public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> getChildren)
{
if (source == null) throw new ArgumentNullException(nameof(source));
if (getChildren == null) return source;
return SelectRecursiveIterator(source, getChildren);
}
Имея это на месте, вы можете перебирать все узлы в вашем дереве и возвращать либо все соответствующие узлы:
static IEnumerable<TreeNode> FindAllNodesByHeader(TreeView tree, string header)
{
return tree.Items.Cast<TreeViewItem>().SelectRecursive(node => node.Items.Cast<TreeViewItem>()).Where(node => node.Header == header);
}
или только первый соответствующий узел:
static TreeNode FindFirstNodeByHeader(TreeView tree, string header)
{
return tree.Items.Cast<TreeViewItem>().SelectRecursive(node => node.Items.Cast<TreeViewItem>()).FirstOrDefault(node => node.Header == header);
}
Member 12969975
у меня есть элемент управления WPF treeview, поэтому я получаю ошибку, что Itemscontrol не имеет определения для SelectRecursiv...
Richard Deeming
Вы должны были упомянуть, что используете WPF в своем вопросе!
Попробуй:
tree.Items.SelectRecursive(node => node.Items).FirstOrDefault(node => node.Header == header);
Member 12969975
я попробовал это сделать, но элемент управления WPF treeview не имеет метода selectrecursive
Richard Deeming
Похоже Items
коллекция не реализуется IEnumerable<T>
.
Попробуйте добавить .Cast<TreeViewItem>()
в собственность:
tree.Items.Cast<TreeViewItem>().SelectRecursive(node => node.Items.Cast<TreeViewItem>()).FirstOrDefault(node => node.Header == header);
Member 12969975
статический TreeViewItem FindFirstNodeByHeader(дерево TreeView, строковый заголовок)
{
верните дерево.Предметы.Бросание&ЛТ;treeviewitem и GT;().SelectRecursive(узел =&ГТ; узел.Предметы.Бросание&ЛТ;treeviewitem и GT;()).Метода firstordefault(узел =&ГТ; узел.Заголовок = = заголовок);
}
я попробовал это сделать вот так и получил ошибку что TreeViewItem не имеет определения для SelectRecursive
Richard Deeming
Тогда вы не объявили метод расширения должным образом, или вам не хватает using
заявление.
Member 12969975
у вас есть список использований?