Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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# 如何将LinkedList中一个节点的下一个属性设置为另一个LinkedList中的另一个节点?_C#_Visual Studio_Linked List - Fatal编程技术网

C# 如何将LinkedList中一个节点的下一个属性设置为另一个LinkedList中的另一个节点?

C# 如何将LinkedList中一个节点的下一个属性设置为另一个LinkedList中的另一个节点?,c#,visual-studio,linked-list,C#,Visual Studio,Linked List,在C#中,我当前正在尝试将某个链接列表中的一个节点链接到另一个链接列表中的另一个节点。我正试图使这一游戏中的瓷砖是在相互堆叠的水平连接。但是,更改列表中的下一个属性会产生错误。代码如下: tileList2.First.Next=tileList1.First 这就是错误 无法将属性或索引器“LinkedListNode.Next”分配给--它是只读的。“ 如何(否则)将此节点的下一个设置为另一个节点的第一个?导致此错误的原因是什么?是否有解决方法?您不能设置LinkedListNode。下一个

在C#中,我当前正在尝试将某个链接列表中的一个节点链接到另一个链接列表中的另一个节点。我正试图使这一游戏中的瓷砖是在相互堆叠的水平连接。但是,更改列表中的下一个属性会产生错误。代码如下:

tileList2.First.Next=tileList1.First

这就是错误

无法将属性或索引器“LinkedListNode.Next”分配给--它是只读的。“


如何(否则)将此节点的下一个设置为另一个节点的第一个?导致此错误的原因是什么?是否有解决方法?

您不能设置
LinkedListNode。下一个
直接设置为只读

您也不能使用
LinkedList.AddLast
,因为您尝试添加的
LinkedListNode
已在列表中

实际上,您需要打破列表并创建新的列表


或者,您可以实现自己的链表。

LinkedList框架实现中的每个节点都有一个对包含它的列表的引用,这使得将元素转移到另一个列表中,这与链表实现的目的背道而驰。如果您想在此实现中将元素转移到另一个列表,您可以必须一个接一个地删除和添加它们(在列表中使用remove和AddAfter),以便它们各自获得对另一个列表的引用

不过,我怀疑这并不是你想要的。正如其他评论所说,你的列表的需求可能很简单,你最好自己制作一个简单得多的链表。这个问题已经在SO()的其他地方讨论过了

因为这个答案不包括简单的枚举和初始化,所以我做了自己的

  class ListNode<T> : IEnumerable<T>
  {
     public T data;
     public ListNode<T> Next;
     private ListNode() { }
     public ListNode(IEnumerable<T> init)
     {
        ListNode<T> current = null;
        foreach(T elem in init)
        {
           if (current == null) current = this; else current = current.Next = new ListNode<T>();
           current.data = elem;
        }
     }

     class ListEnum : IEnumerator<T>
     {
        private ListNode<T> first;
        private ListNode<T> current;
        bool more;
        public ListEnum(ListNode<T> first) { this.first = first; more = true; }
        public T Current { get { return current.data; } }
        public void Dispose(){}
        object System.Collections.IEnumerator.Current { get { return current.data; } }
        public void Reset() { current = null; more = true; }
        public bool MoveNext()
        {
           if (!more)
              return false;
           else if (current == null)
              return more = ((current = first) != null);
           else
              return more = ((current = current.Next) != null);
        }
     }

     public IEnumerator<T> GetEnumerator()
     {
        return new ListEnum(this);
     }

     System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
     {
        return GetEnumerator();
     }
  }

  static void Main(string[] args)
  {
     ListNode<int> l1 = new ListNode<int>(new int[] {3,1,4,1,5,9});
     ListNode<int> l2 = new ListNode<int>(new int[] { 5 });

     l2.Next = l1.Next;
     foreach (int i in l2)
        Console.WriteLine(i);
  }
类列表节点:IEnumerable
{
公共数据;
公共列表节点下一步;
私有ListNode(){}
公共列表节点(IEnumerable init)
{
ListNode当前=空;
foreach(初始中的元素)
{
if(current==null)current=this;else current=current.Next=new ListNode();
当前数据=元素;
}
}
类ListEnum:IEnumerator
{
私有列表节点优先;
私有节点电流;
布尔更多;
public ListEnum(ListNode first){this.first=first;more=true;}
公共T Current{get{return Current.data;}}
public void Dispose(){}
对象System.Collections.IEnumerator.Current{get{return Current.data;}}
public void Reset(){current=null;more=true;}
公共图书馆
{
如果(!更多)
返回false;
else if(当前==null)
返回更多=((当前=第一个)!=null);
其他的
返回更多=((当前=当前.下一步)!=null);
}
}
公共IEnumerator GetEnumerator()
{
返回新的ListEnum(this);
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}
静态void Main(字符串[]参数)
{
ListNodeL1=新的ListNode(新的int[]{3,1,4,1,5,9});
ListNode l2=新的ListNode(新的int[]{5});
l2.Next=l1.Next;
foreach(l2中的int i)
控制台写入线(i);
}

将问题的简化示例显示为代码。您需要使用
LinkedList
类的方法。您不能这样做。您必须将第二个列表添加到第一个列表,或者创建一个包含指向其他列表的属性的类。该类可以继承LinkList对象,以便您可以通过主列表进行枚举。@jdweng谢谢你的回答,我会找到另一种解决这个问题的方法。