2016-10-24 8 views
1

C#では、現在、特定のLinkedListの1つのノードを別のLinkedListの別のノードにリンクしようとしています。私はタイルが互いに重ねられたレベルで接続されているゲームのためにこれを作ろうとしています。ただし、リストの[次へ]プロパティを変更するとエラーが発生します。これはコードです:LinkedListのノードのNextプロパティを別のLinkedListの別のノードに設定するにはどうすればよいですか?

tileList2.First.Next = tileList1.First;

これはエラーです。

プロパティまたはインデクサー「をLinkedListNode.Next」に割り当てることはできません - 。私は(それ以外)その他のまずに、このノードの次を設定することができますどのようにそれは読み取り専用です」

ノード?何このエラーを引き起こしていることは?任意の回避策はありますか?

+0

問題の詳細な例をコードとして表示します。 – mybirthname

+0

'LinkedList'クラスのメソッドを使う必要があります。 – juharr

+0

できません。 2番目のリストを最初のリストに追加するか、または他のリストを指すプロパティを含むクラスを作成する必要があります。クラスはLinkListオブジェクトを継承して、メインリストを列挙できます。 – jdweng

答えて

0

あなたはそれが読み取り専用である、直接LinkedListNode.Nextを設定することはできません。

あなたがしようとしているLinkedlListNodeので、あなたもLinkedList.AddLastを使用することはできません追加するには既にリストにあります。

実際には、リストを分割して新しいリストを作成する必要があります。

あなた自身のリンクリストを実装することもできます。

0

LinkedListのフレームワーク実装のすべてのノードには、それを含むリストへの参照があり、リンクリスト実装の目的を無効にする別のリストO(n) instead of O(1)に要素を転送します。この実装で要素を別のリストに転送したい場合は、リストのRemoveとAddAfterを使用して1つずつ削除して追加し、それぞれが別のリストへの参照を取得する必要があります。

私はこれがあなたの後ではないと思う。他のコメントが述べているように、あなたのリストの必要性はおそらく、あなたがもっと簡単なリンクリストを作成する方が良いほど簡単です。そしてその質問は既にSO(Creating a very simple linked list)のどこかで取り上げられています。

この回答には簡単な列挙と初期化は含まれていないので、私は自分で作成しました。

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); 
    } 
関連する問題