Я пытаюсь придумать алгоритм обхода дерева, но я застреваю.
Это довольно сложный вопрос (по сравнению с другими, которые я задавал), поэтому мне, возможно, придется продолжать самостоятельно разбираться. Но я думал, что выкину это сюда.
У меня следующая структура класса:
public class Transition
{
// The state we are moving from.
public String From { get; set; }
// All the To states for this from
public List<String>To { get; set; }
}
List<Transition> currentTransistions;
Когда currentTransistions полностью заполнен, это выглядит так (для меня):
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfTransition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Transition>
<From />
<To>
<string>Not Done</string>
</To>
</Transition>
<Transition>
<From>Not Done</From>
<To>
<string>In Progress</string>
<string>Deleted</string>
</To>
</Transition>
<Transition>
<From>Deleted</From>
<To>
<string>Not Done</string>
</To>
</Transition>
<Transition>
<From>In Progress</From>
<To>
<string>Done</string>
<string>Ready For Test</string>
<string>Deleted</string>
</To>
</Transition>
<Transition>
<From>Done</From>
<To>
<string>In Progress</string>
</To>
</Transition>
<Transition>
<From>Ready For Test</From>
<To>
<string>In Progress</string>
<string>Done</string>
<string>Deleted</string>
</To>
</Transition>
</ArrayOfTransition>
Идея в том, что я сопоставил переходы состояний для рабочих элементов TFS. Теперь мне нужен способ сказать: «Учитывая текущее состояние, как мне добраться до другого состояния».
В идеале это будет выглядеть так:
foreach (string state in GetToFinalState(finalState, currentState, currentTransistions)
{
// Save the workitem at the state so we can get to the final state.
}
GetToFinalState должен был бы иметь возможность рассчитать кратчайший путь и использовать функцию выхода C #, чтобы предлагать их по одному для оператора foreach.
Я раньше использовал yield one, поэтому думаю, что смогу это выяснить. Но я не уверен, как это сделать одновременно с поиском кратчайшего пути (без пересчета каждый раз в функции)?
Если вы прочитали это далеко, спасибо. Если вы предлагаете ответ, то двойное спасибо.