2013-12-19 85 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