C# 使用C语言处理列表#
我从2天以来一直在使用此页面上的代码,当我尝试更改代码以将项目添加到列表中前一个项目之后(而不是前一个项目之前)时出现问题 我知道我可以在C#中使用“List”集合,但我的目的是了解List是如何工作的C# 使用C语言处理列表#,c#,class,list,C#,Class,List,我从2天以来一直在使用此页面上的代码,当我尝试更改代码以将项目添加到列表中前一个项目之后(而不是前一个项目之前)时出现问题 我知道我可以在C#中使用“List”集合,但我的目的是了解List是如何工作的 谢谢你的帮助。在我回答这个问题之前,我觉得我应该提一下,在英语论坛上用西班牙语发布代码的品味很差。我花了比写这篇文章更多的时间试图理解你基本上胡言乱语的命名 另外,List,尽管它的命名很差,但并没有实现为列表。它是数组上的包装器,这就是.ToArray()如此高效的原因 现在,针对您的具体问题
谢谢你的帮助。在我回答这个问题之前,我觉得我应该提一下,在英语论坛上用西班牙语发布代码的品味很差。我花了比写这篇文章更多的时间试图理解你基本上胡言乱语的命名 另外,
List
,尽管它的命名很差,但并没有实现为列表。它是数组上的包装器,这就是.ToArray()
如此高效的原因
现在,针对您的具体问题,您需要将头部链接设置为刚创建的节点,并将其下一个链接设置为上一个头部链接:
if (EsVacio())
primerNodo = ultimoNodo = new ListNode(nom, cod, null);
else
{
var node=new ListNode(nom, cod, primerNodo);
node.Siguiente=primerNodo;
primerNodo=node;
}
在我回答这个问题之前,我觉得我应该提一提,在英语论坛上用西班牙语发布代码的品味很差。我花了比写这篇文章更多的时间试图理解你基本上胡言乱语的命名 另外,
List
,尽管它的命名很差,但并没有实现为列表。它是数组上的包装器,这就是.ToArray()
如此高效的原因
现在,针对您的具体问题,您需要将头部链接设置为刚创建的节点,并将其下一个链接设置为上一个头部链接:
if (EsVacio())
primerNodo = ultimoNodo = new ListNode(nom, cod, null);
else
{
var node=new ListNode(nom, cod, primerNodo);
node.Siguiente=primerNodo;
primerNodo=node;
}
这是伪代码
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;
}
这是伪代码
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;
}
那么,如何更改代码以在前一项之后添加项呢?看起来您正在使用自己的列表实现。。。那么你能给我们看一下这个修订的完整代码吗?我们需要知道你是如何处理内部收集。数组?好的,现在我看到我要求的实现在您提供的链接中。谢谢。如果不是为了学习,您可能需要使用LinkedList,它是.NET中通用链表的一个实现。尽管有这样的说法,gjvdkamp还是有点有效,您可以使用类似Reflector或ILSpy的方法,看看它是如何实现的,尤其是AddAfter(…)方法。那么我如何更改代码以在前一项之后添加项呢?看起来您正在使用自己的列表实现。。。那么你能给我们看一下这个修订的完整代码吗?我们需要知道你是如何处理内部收集。数组?好的,现在我看到我要求的实现在您提供的链接中。谢谢。如果不是为了学习,您可能需要使用LinkedList,它是.NET中通用链表的一个实现。尽管有这种说法,gjvdkamp还是有一定的合理性,但您可以像Reflector或ILSpy一样使用它,看看它是如何实现的,尤其是AddAfter(…)方法。