.NET List.Find运行时错误

时间:2011-08-31 14:34:27

标签: c# data-structures treeview

我正在构建一个自定义数据结构来保存TreeView,以便我可以将其序列化。这一点是无关紧要的,是背景,但我把它放在这里。

我有一个CustomNode类,树视图将保存在List<CustomNode>中:

private class CustomNode
    {
        public CustomNode()
        {}

        public CustomNode (string name)
        {
            NodeName = name;
        }
        public string NodeName { get; set; }
        public int Level { get; set; }
        public int Index { get; set; }
        public CustomNode parent;
        public List<CustomNode> children;
    }

这是我试图解决的相关问题。在我的代码中的某一点,我想找到特定CustomNode的父级,所以我这样做:

   CustomNode customNode = new CustomNode();
   //initialise properties of customNode (below)
   . 
   .
   .
   CustomNode customNodeParent = new CustomNode();
                            customNodeParent = listOfCustomNodes.Find(_customNode => (_customNode.Index == node.Index && _customNode.Level == node.Level));
   customNode.Index = customNodeParent.children.Count;

最后一行抛出对象引用未设置为对象的实例。异常。我不明白为什么会这样。

编辑:还有另一个问题。在我打电话的地方:

customNode.Index = customNodeParent.children.Count;

customNodeParent为null。我看到发生了什么。它找不到节点。需要解决这个问题。

2 个答案:

答案 0 :(得分:4)

CustomNode的声明中,更改

public List<CustomNode> children;

public List<CustomNode> children = new List<CustomNode>();

使用您当前的代码,您说“CustomNode有一个名为children的字段,其类型为List<CustomNode>”,但此字段的永远不会设置,所以当创建CustomNode时,childrennull

通过进行上述更改,您说“首次创建时,CustomNode的{​​{1}}是实际对象,新children”。由于这是一个实际的对象,而不是List<CustomNode>,因此可以安全地询问它null

答案 1 :(得分:0)

因为customNodeParent.children为空。

在尝试使用之前,您需要实例化customNodeParent.children

最简单地完成声明,然后可能在构造函数中,作为最后的手段,在类外的实例化代码中。