Я определяю следующий класс Node для того, чтобы получить отношение родителя/ребенкаПостроить дерево из таблицы
class Node
{
public int Id { get; set; }
public int? ParentId { get; set; }
public string Operator { get; set; }
public string Sign { get; set; }
public Node Parent { get; set; }
public IList<Node> Children { get; set; }
public Node()
{
Children = new List<Node>();
}
public override string ToString()
{
//return "Node: " + Operator + " " + Id + " " + string.Join(",", Children.Select(x => x.Id));
return "Node: " + Operator + " " + Id + " "
+ string.Join(",", Children.Select(x => string.Format("({0}, {1})", x.Sign, x.Id)));
}
}
У меня есть следующая таблица, как, например
PNLId PNLCode PNLParentId Operator Sign
0
49 C 51 + NULL
50 Z 51 + NULL
51 Y 107/ NULL
52 B 107/ NULL
53 B 108 + NULL
Я написал следующий скрипт в главная:
var map = new Dictionary<int, Node>();
var rootNodes = new List<Node>();
foreach (DataRow row in dt.Rows)
{
int id = Convert.ToInt32(row["PNLId"]);
int? parentId = null;
if (!row.IsNull("PNLParentId"))
{
parentId = Convert.ToInt32(row["PNLParentId"]);
}
string op = Convert.ToString(row["Operator"]);
string sign = Convert.ToString(row["Sign"]);
map[id] = new Node
{
Id = id,
ParentId = parentId,
Operator = op,
Sign=sign
};
}
foreach (var pair in map)
{
if (pair.Value.ParentId.HasValue)
{
var parent = map[pair.Value.ParentId.Value];
pair.Value.Parent = parent;
parent.Children.Add(pair.Value);
parent.Operator = pair.Value.Operator;
}
else
{
rootNodes.Add(pair.Value);
}
}
В этом случае он будет возвращаться, для PNLParentId 107
[107 Node: + 107 (, 51),(, 52)]
что неправильно это должно быть
[107 Node:/107 (, 51),(, 52)]
Как я могу изменить код выше, чтобы построить дерево узлов первой. Затем начните с корневых узлов, копируя оператор из дочерних элементов. Продвижение детей и копирование их детского оператора?
Зачем снимать. Значения? Я не понял. – user3548593
@ user3548593: Я отредактировал ответ user3615347 и добавил объяснение. Надеюсь, это поможет. – Matt
@ user3548593: Вы можете проверить код из этого ответа в [LinqPad] (http://www.linqpad.net/) (инструмент, который является бесплатным) - просто поместите его в метод 'main()', добавьте ' rootNodes.Dump(); map.Dump(); 'в конце, затем добавьте класс' Node' из вашего вопроса. Если вы запустите пример, вы увидите, что рекурсивная структура создается в окне вывода: одно из преимуществ метода '.Dump()' LinqPad предоставляет! – Matt