Найти элемент в многоуровневом списке и добавить к нему новый уровень
Не получается написать функцию, которая бы принимала на вход 2 аргумента Func(ObservableCollection<Node> список, строковое_значение_для_поиска), искала по всем вложенным спискам и в случае совпадения Name добавляла еще один уровень данных.
public class Node
{
public string Name { get; set; }
public ObservableCollection<Node> Child { get; set; }
}
ObservableCollection<Node> nodes;
nodes = new ObservableCollection<Node>
{
new Node
{
Name = "1.1",
},
new Node
{
Name = "1.2",
Child = new ObservableCollection<Node>
{
new Node {Name="2.1" },
new Node {Name="2.2" },
new Node {Name="2.3" },
}
},
};
Я понимаю, что она должна рекурсивно обходить все уровни, но у меня ничего не выходит. После добавления должно быть примерно так.
nodes = new ObservableCollection<Node>
{
new Node
{
Name = "1.1",
},
new Node
{
Name = "1.2",
Child = new ObservableCollection<Node>
{
new Node {Name="2.1" },
new Node {Name="2.2" },
//После добавления
new Node
{
Name="2.3",
Child = new ObservableCollection<Node>
{
new Node {Name = "3" }
}
}
}
},
};
Ответы (1 шт):
Автор решения: Alexey Vesker
→ Ссылка
Если решать в лоб то можно так:
void FindAndAdd(ObservableCollection<Node> listOfNode, string nodeName)
{
for(int iter =0; iter < listOfNode.Count; iter++)
{
if(listOfNode[iter].Name == nodeName)
{ listOfNode[iter].Child.Add(new Node(){"x.x"}); }
else
{ FindAndAdd(listOfNode.Child, nodeName) ; }
}
}
В вашем случае, вы выполняете перебор через цикл foreach, где переменной а присваивается значение очередного элемента коллекции, и новый элемент вы добавляете не в коллекцию, а в переменную a, поэтому исходная коллекция у вас остается неизменной.