2013-12-19 60 views
-1

我已经搜索了这么久,很难为此,现在我在公路的尽头。我的这个问题比这个项目更多,但我最终取消了其他项目。我有一个代码(C#),这基本上是我试图做霍夫曼树。有一次,我这样做(“节点列表”的列表(节点)):C#对象突然无效

Node node = new Node(nodeList[0], nodeList[1]); 
nodeList.Add(node); // Adds a new node which includes two subnodes. 

// Remove nodes from list (as they are now included in another node) 
nodeList.RemoveAt(0); 
nodeList.RemoveAt(1); 

这里使用的构造函数是:

// Constructor that takes nodes 
public Node(Node left, Node right) 
{ 
    leftNode = new Node(left); 
    rightNode = new Node(right); 
} 

// Constructor that only takes 1 single node 
public Node(Node copy) 
{ 
    rightNode = copy.rightNode; 
    leftNode = copy.leftNode; 
    unencodedBits = copy.unencodedBits; 
    encodingValue = copy.encodingValue; 
    positions = copy.positions; 
} 

我做的第二个构造为希望它会修复我的问题(认为从列表中删除节点可能会消除它)(我的节点类中的所有值都在第二个构造函数的右侧)。

问题:执行第二个“RemoveAt”节点将不再包含这两个节点。我不明白为什么。我需要做些什么来防止这种情况发生,为什么会发生(所以我可以在将来了解类似的情况)?

我大概忘了包含一些重要信息;如果我有,请告诉我。并感谢您的任何帮助。

+5

无论何时您对代码的作用有疑问,它有助于设置断点,然后逐步执行代码。你将能够看到每个方法调用正在做什么。 – mason

+0

我知道每种方法正在调用什么。我写了这些方法(RemoveAt除外,但我没有办法检查它是做什么的。)我只是想知道为什么它会突然删除我的对象(无论如何,不​​是所有的对象)。 – Morten242

+1

You _do_ have a查看RemoveAt的功能。就像我说的那样,设置一个断点并在您逐步浏览时监视您的nodeList对象。你会看到RemoveAt对它的影响。 – mason

回答

1

您的nodeList对象是数组还是List?如果它是一个列表,然后nodeList.RemoveAt(0)导致当前所在的节点和索引1至现在位于索引0,所以你需要调用

nodeList.RemoveAt(0); 
nodeList.RemoveAt(0); 

代替

nodeList.RemoveAt(0); 
nodeList.RemoveAt(1); 

请看这里:http://msdn.microsoft.com/en-us/library/5cw9x18z(v=vs.110).aspx

+0

@ user2864740:他从来没有说过他有个例外...... – SLaks

+1

@SLaks真的。我被这个可怕的标题所左右。 – user2864740