Глядя на вопрос / код, я думаю, что проблема связана не с одной вещью (как вы сказали избыточная переменная tempTable), а с несколькими областями, я попытаюсь выделить эти области / проблемы.
1) Теория. Первое, что вам нужно знать перед итерацией дерева, - это 2 способа итерации деревьев: " в ширину * " и " в глубину"».Они могут быть реализованы через ' recursion ' и ' loop '.Об этом много статей.
Предлагаю вам прочитать несколько статей об этих подходах, некоторые из них:
2) Проблема, которую вы заметили из производительности pov незначительна.Да, вы правы, когда говорите, что сохранение результата предыдущего вызова в 'tempTable' не очень хорошо.Возвращение «tempTable» не оказывает большого влияния на производительность или память, поскольку « tempTamble » ссылается на тот же объект, что и « tndList ».Возвращаемый параметр метода не дает « неэффективность ».Единственное, на что он влияет - не чистый код и несколько байтов в стеке.На самом деле вам не нужно ничего возвращать в вашем методе.Почему вы возвращаете список?
Предлагаю прочитать о значении и ссылочных типах .Некоторые материалы
Я немного изменил ваш код, теперь он возвращает void :
public void SearchNodesByRelationshipId(ITreeNodeDefinition treeNodeDefinition, int? relationshipId, List<ITreeNodeDefinition> tndList)
{
if (treeNodeDefinition.RelationshipId == relationshipId)
{
tndList.Add(treeNodeDefinition);
}
if (treeNodeDefinition.Nodes.Count != 0)
{
foreach (ITreeNodeDefinition nodeDefinition in treeNodeDefinition.Nodes)
{
this.SearchNodesByRelationshipId(nodeDefinition, relationshipId, tndList);
}
}
}
3) Еще одна проблема.Существенно. То, как вы выполняете итерации - это рекурсия ' глубина-первая '.Этот подход не является надежным, потенциально он приводит к «StackOverflowException».Из-за длинной цепочки рекурсивных вызовов методов.
Я предлагаю вам прочитать об алгоритмах итерации и рекурсии в контексте деревьев и реализовать подход итерации .
Только для информации: есть еще один способ избежать 'stackOverfrwException' с помощью подхода recursion - tail recursion , но, на самом деле, такого механизма нет в C#
, но такой механизм существует в F#
и других функциональных языках.
Вкратце, как работает итеративный подход, в псевдокоде:
put the root to the collection X (which is queue for '*breadth-first*' and stack for '*depth-first*')
Do while X is not empty
var currentNode = get next node from X
process current root (do checks that you need, aggregate data etc.)
get child nodes of the currentNode, save them into X