使用C#中的列表

时间:2011-03-17 15:10:05

标签: c# class list

我从2天开始使用此页面上的代码Working with C# lists,当我尝试更改代码以将项目添加到上一项目之后的列表(而不是上一项目之前)时,我遇到了问题。

//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);
            }
        }

我知道我可以使用“List<>”在C#中收集,但我的目的是了解列表的工作原理。

感谢您的帮助。

2 个答案:

答案 0 :(得分: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方法中指定要将新节点附加到哪个节点。或者,如果您使用类似迭代器的模式(您的Linked List类具有Current节点),您可以执行类似的操作..只需获取当前节点,上面的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;
}

答案 1 :(得分:-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;
}