Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用C语言处理列表#_C#_Class_List - Fatal编程技术网

C# 使用C语言处理列表#

C# 使用C语言处理列表#,c#,class,list,C#,Class,List,我从2天以来一直在使用此页面上的代码,当我尝试更改代码以将项目添加到列表中前一个项目之后(而不是前一个项目之前)时出现问题 我知道我可以在C#中使用“List”集合,但我的目的是了解List是如何工作的 谢谢你的帮助。在我回答这个问题之前,我觉得我应该提一下,在英语论坛上用西班牙语发布代码的品味很差。我花了比写这篇文章更多的时间试图理解你基本上胡言乱语的命名 另外,List,尽管它的命名很差,但并没有实现为列表。它是数组上的包装器,这就是.ToArray()如此高效的原因 现在,针对您的具体问题

我从2天以来一直在使用此页面上的代码,当我尝试更改代码以将项目添加到列表中前一个项目之后(而不是前一个项目之前)时出现问题

我知道我可以在C#中使用“List”集合,但我的目的是了解List是如何工作的


谢谢你的帮助。

在我回答这个问题之前,我觉得我应该提一下,在英语论坛上用西班牙语发布代码的品味很差。我花了比写这篇文章更多的时间试图理解你基本上胡言乱语的命名

另外,
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(…)方法。