C# 定义与c的父/子关系时出错#
我有下表C# 定义与c的父/子关系时出错#,c#,C#,我有下表 PNLId PNLCode PNLParentId Operator Sign 0 0 ~ S 49 C 51 + NULL 50 Z 51 + NULL 51 Y 107 / NULL 52 B 107 / NULL 53 B 108 + NULL 我定义了以下类 class Node { public int Id { get; set; } public int?
PNLId PNLCode PNLParentId Operator Sign
0 0 ~ S
49 C 51 + NULL
50 Z 51 + NULL
51 Y 107 / NULL
52 B 107 / NULL
53 B 108 + NULL
我定义了以下类
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)));
}
}
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);
}
}
如何修改上面的代码以获得107的正确运算符,即
/
?可能+
运算符来自另一个孩子:
49 C 51 + NULL
50 Z 51 + NULL
根据提取行的顺序,49
或50
节点将父节点的运算符
设置为<51
编辑
它取决于您的这一行代码:
parent.Operator = pair.Value.Operator;
从您的帖子中,您假设父项为107
,而对.Value
为51
或52
。这样,当将子对象分配给父对象时,/
操作符被分配给107
父对象
但是,当处理49
和50
子节点时,+
操作符将应用于它们的父节点节点51
。因此,当从节点将操作符应用于父节点107
时,从49
或50
的+/code>操作符通过节点应用于107
节点51运行代码时,它会显示节点:/107(null,51),
。有什么问题?订单会干扰吗?请给我解释一下。那么我如何修改代码呢?我已经花了两天多的时间在这上面了。我没有弄明白。在我提出一些绝对有效的建议之前,你需要更好地定义需求。51
节点操作符应该是什么?它是否可以与107
父项不同?我只是回答了为什么它不起作用。节点51的操作符可能不同于107父节点。当我更新字段操作符时,我应该从根节点开始吗?
parent.Operator = pair.Value.Operator;