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;