2011-03-17 69 views
2

Im使用本頁面上的代碼Working with C# lists自2天以來,當我嘗試更改代碼以將項目添加到列表之前的項目(而不是上一個項目之前)時出現問題, 。在C#中使用列表

//ListNode constructor params: name, code, nextNode 
//Insert element after the first element 
     public void InsertelementAfterTheFirst(object name, object code) 
     { 
      if (IsEmpty()) 
       FirstNode = LastNode = new ListNode(name, code, null); 
      else 
      { 
       FirstNode = new ListNode(name, code, FirstNode); 
      } 
     } 

我知道我可以使用「列表<>」集合在C#中,但我的目的是學習如何做名單的工作。

感謝您的幫助。

+0

那麼,怎樣才能改變我的代碼上一個項目後添加的項目? – Jose 2011-03-17 15:11:44

+0

看起來像你正在使用自己的列表實現...所以你能告訴我們這個imlpementation的完整代碼嗎?我們需要知道你在內部如何處理收集。數組? – Jonathan 2011-03-17 15:19:41

+0

好吧,現在我看到我要求的實現是在您提供的鏈接中。謝謝。 – Jonathan 2011-03-17 15:27:52

回答

-1

在我回答這個問題之前,我覺得我應該提一下,在講英語的論壇上用西班牙語發帖的代碼很糟糕。我花了很多時間試圖理解你的基本上亂碼的命名,而不是寫這篇文章。

而且,List<>儘管名稱很差,但並未作爲列表實施。它是一個數組的封裝,這就是爲什麼.ToArray()如此高效。

現在您的具體問題,你想你的頭的鏈接設置爲您剛剛創建的節點,設置它的下一個鏈接到以前的頭鏈接:

if (EsVacio()) 
    primerNodo = ultimoNodo = new ListNode(nom, cod, null); 
else 
{ 
    var node=new ListNode(nom, cod, primerNodo); 
    node.Siguiente=primerNodo; 
    primerNodo=node; 
} 
+0

不要這麼難:D我試圖翻譯代碼。 – Jonathan 2011-03-17 15:23:47

1

這裏是僞代碼...

if (firstNode is empty) 
{ 
    //new list... 
    firstNode = lastNode = new Node(name, code, null); 
} 
else 
{ 
    var node = new Node(name, code, firstNode.nextNode); 
    firstNode.nextNode = node; 
} 

唯一的是,這隻適用於在第一個節點之後添加一個節點。更好的方法可能是在InsertAfter方法中指定要將新節點附加到的節點。或者,如果您使用的是類似迭代器的模式(您的鏈接列表類具有當前節點),則可以執行類似的操作。只需獲取當前節點並且上面else分支中的代碼仍然可以工作(而不是firstNode,它會是currentNode)。

喜歡的東西:

public ListNode InsertAfterCurrent(object name, object code) 
{ 
    if (currentNode == null) 
    { 
    //assume new list 
    currentNode = firstNode = lastNode = new ListNode(name, code, null); 
    } 
    else 
    { 
    currentNode.NextNode = new ListNode(name, code, currentNode.NextNode); 
    } 
} 

public ListNode InsertAfter(ListNode anchor, object name, object code) 
{ 
    if (anchor != null && NodeIsPartOfList(anchor)) 
    { 
    anchor.NextNode = new ListNode(name, code, anchor.NextNode); 
    } 
} 

public bool NodeIsPartOfList(ListNode node) 
{ 
    var current = firstNode; 
    while (current != null) 
    { 
    if (current == node) 
     return true; 

    current = current.NextNode; 
    } 
    return false; 
}