У меня проблемы с размышлениями о решении, которое я пытаюсь создать, может быть, кто-то здесь сможет направить меня в правильном направлении.
У меня есть список процессов, принадлежащих процессу, эти процессы могут иметь дочерние элементы, и эти дочерние элементы могут также иметь дочерние элементы и т. Д.
Список выглядит так:
ProcID ChildOFID
1 0 (means no child)
2 1
3 2
4 3
5 3
6 5
Как видите, в процедуре "3" содержатся 2 ребенка, из которых у одного (5) также есть ребенок (6).
Я хочу перебрать этот список и нарисовать для них объекты на холсте.
Сейчас у меня есть следующий код, но он требует, чтобы я написал цикл для каждого уровня, который я хочу показать.
int prev_location_left = 0;
int prev_location_top = 0;
// Select Last ProcessStep (has no PreID!)
var lastProcess = (from p in processlist
where p.PreID == 0
select p).FirstOrDefault<ProcessStep>();
if (lastProcess != null)
{
create_processStep(lastProcess.ProcessID,
lastProcess.Name,
lastProcess.ProcessTypeID,
(900),
(30),
lastProcess.CummulativeCT,
lastProcess.WaitingTimeActual,
lastProcess.ValueAddTimeActual,
lastProcess.ProcessStepTime);
prev_location_left = 900;
prev_location_top = 30;
}
// Select all the ProcessSteps that are a child of the last(first) one.
var listChilds = (from p in processlist
where p.PreID == lastProcess.ProcessID
select p);
int childscount = listChilds.Count();
int cnt = 0;
foreach (ProcessStep ps in listChilds)
{
create_processStep(ps.ProcessID,
ps.Name,
ps.ProcessTypeID,
(prev_location_left - (150) ),
(30 + (60 *cnt)),
ps.CummulativeCT,
ps.WaitingTimeActual,
ps.ValueAddTimeActual,
ps.ProcessStepTime);
var listChilds2 = (from p in processlist
where p.PreID == ps.ProcessID
select p);
int cnt2 = 0;
foreach (ProcessStep ps2 in listChilds2)
{
create_processStep(ps2.ProcessID,
ps2.Name,
ps2.ProcessTypeID,
(prev_location_left - (300) ),
(30 + (60 *cnt2)),
ps2.CummulativeCT,
ps2.WaitingTimeActual,
ps2.ValueAddTimeActual,
ps2.ProcessStepTime);
var listChilds3 = (from p in processlist
where p.PreID == ps2.ProcessID
select p);
int cnt3 = 0;
foreach (ProcessStep ps3 in listChilds3)
{
create_processStep(ps3.ProcessID,
ps3.Name,
ps3.ProcessTypeID,
(prev_location_left - (450)),
(30 + (60 * cnt2)),
ps3.CummulativeCT,
ps3.WaitingTimeActual,
ps3.ValueAddTimeActual,
ps3.ProcessStepTime);
cnt3 = cnt3 + 1;
}
cnt2 = cnt2 + 1;
}
cnt = cnt + 1;
}
Итак, что нужно сделать, это следующее:
- Получить последний процесс (тот, у которого PreId == 0)
- Проверьте, какие у него дети, и нарисуйте их на холсте: слева -150, первый ребенок сверху 30, второй сверху 90, третий сверху 150 и т. Д.
Теперь для каждого найденного ребенка мне также нужно проверить, есть ли у него дети и снова выполнить ту же логику, у меня возникли проблемы с созданием этого бесконечного цикла.
Помощь! :)