Эта проблема лучше всего решается с помощью SAX.В .NET есть несколько реализаций SAX, хотя мне бы хотелось, чтобы в .NET была нативная реализация.
Проблема в том, что у вас есть только два цикла for, максимум, что вы сможете сделать, это двауровни.Это может быть утомительно, чтобы продолжать добавлять дополнительные для циклов.Есть лучший шаблон.
Если бы вы не использовали SAX, вам нужно создать универсальный движок, который может обрабатывать любое количество ворот внутри ворот.
Это было бы что-то вродеэто
public void parseRules (State state, IEnumerable<Element> elements)
{
foreach (Element element in elements)
{
if (element.Name.Equals("strategy"))
{
parseNewStrategy(state, element);
}
else if (element.Name.Equals("gate"))
{
parseNewGate(state,element);
}
}
}
Я сильно упрощаю это.Если вы хотите создать это правильно, используйте шаблон Visitor .По сути, это то, что сделал бы двигатель SAX.Это позволит вам «посещать» каждый элемент в документе и предпринимать некоторые заранее определенные действия, когда вы достигнете элемента.
Примерно так
Если я достигну стратегии, сохраню ее имя и установлю поле состояния, в котором говорится, что я в стратегии.Однажды я попал в хранилище информации о них, но пока не создаю массив правил.Если я попаду в новые ворота, перенесу эту новую операцию в стек.Если я нажму на правило, создай новый массив правил и свяжи его с самыми верхними воротами.