Потребуется ли мне рекурсивная функция для итерации Dictionary<String, Object>
из Dictionary<String, Object>
с?
Нет. Любая рекурсивнаяАлгоритм может быть переписан для использования явного стека, а не стека вызовов.
Легче ли использовать рекурсию для этого?
Возможно. Однако, если структура очень глубоко вложена (или содержит циклы), вы можете подвергнуться риску исключения переполнения стека.
Нерекурсивная реализация не особенно сложна в реализации.Это потребует от вас ведения списка (стека или очереди, в зависимости от того, в каком порядке вы хотите посещать детей), который отслеживает под-словари, которые еще предстоит посетить.
Прототип (не рекурсивный) реализация будет выглядеть примерно так:
public IEnumerable<string> GetAllKeys( Dictionary<string,object> dictionary )
{
var stackDictionariesToVisit = new Stack<Dictionary<string,object>>();
stackDictionariesToVisit.Push( dictionary );
// keep visiting iterating until the stack of dictionaries to visit is empty
while( stackDictionariesToVisit.Count > 0 )
{
var nextDictionary = stackDictionariesToVisit.Pop();
foreach( var keyValuePair in nextDictionary )
{
if( keyValuePair.Value is Dictionary<string,object> )
{
stackDictionariesToVisit.Push(
keyValuePair.Value as Dictionary<string,object> );
}
else
{
yield return keyValuePair.Key;
}
}
}
}
Приведенная выше реализация не проверяет ошибки и не проверяет циклы, но заменяет рекурсию явным стеком.
Выбор того, использовать ли рекурсию (или нет) для посещения иерархической структуры данных, должен зависеть от понимания типа хранимых данных, а не от того, какой подход проще. Если у вас глубоко вложенная структура, вам лучшеoff NOT с использованием рекурсии, поскольку вы не можете контролировать, сколько места в стеке у вас будет.С другой стороны, если вы уверены, что данные никогда не будут вложены более чем на несколько уровней, рекурсивная реализация может быть (немного) проще для понимания и поддержки.