OriginalGriff
Во-первых, ParentID должен быть int
не string
Во-вторых, вам вообще не нужна рекурсия, и при условии, что ваши родительские узлы всегда определяются до их дочерних узлов, вы можете использовать один цикл. (Если это случайный порядок, то сначала создайте коллекцию узлов, а затем выполните цикл через нее:
class Chart
{
private static Dictionary<int, Chart> all = new Dictionary<int, Chart>();
public int ID { get; set; }
public string Name { get; set; }
public int ParentID { get; set; }
public List<Chart> Children { get; set; } = new List<Chart>();
private Chart(DataRow row)
{
ID = (int)row["ID"];
Name = (string)row["Name"];
ParentID = (int)row["ParentID"];
all[ID] = this;
}
public static Chart MakeTree(DataTable dt)
{
List<Chart> nodes = new List<Chart>();
Chart root = null;
foreach (DataRow row in dt.AsEnumerable())
{
Chart node = new Chart(row);
if (node.ParentID == 0)
{
if (root != null) throw new ArgumentException("Too many ROOT nodes: only one was expected.");
root = node;
}
else
{
if (root == null) throw new ArgumentException("ROOT node has not been defined: one is required.");
Chart parent = all[node.ParentID];
parent.Children.Add(node);
}
}
return root;
}
}
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("ParentID", typeof(int));
dt.Rows.Add(1, "A", 0);
dt.Rows.Add(2, "B", 1);
dt.Rows.Add(3, "C", 1);
dt.Rows.Add(4, "D", 2);
dt.Rows.Add(5, "E", 3);
dt.Rows.Add(6, "F", 4);
Chart root = Chart.MakeTree(dt);
OriginalGriff
У вас есть один корневой узел: он содержит список всех дочерних элементов диаграммы. Единственный список всех элементов, который вы можете создать, будет содержать один элемент: корневой узел. Все остальные являются дочерними узлами этого корня.
Так зачем тебе это вообще нужно?
prapti.n3
Потому что это только пример. Данные, над которыми я работаю, имеют 3-4 корня с родительским идентификатором 0.
OriginalGriff
Поэтому создайте "фиктивный узел" с идентификатором 0, а затем верните дочерний список из него!
Или добавьте коллекцию узлов для возврата и добавьте к ней все узлы с родителем 0 вместо того, чтобы ограничивать ее одним корнем.