2016-10-24 2 views
1

В C# я в настоящее время пытаюсь связать один узел с определенным LinkedList с другим узлом в другом LinkedList. Я пытаюсь сделать это для игры, в которой плитки соединены в уровни, уложенные сверху друг друга. Однако изменение свойства Next в списке дает ошибку. Это код:Как установить свойство Next в узле LinkedList на другой узел в другом LinkedList?

tileList2.First.Next = tileList1.First;

Это ошибка;

Свойство или индексатор «LinkedListNode.Next» не может быть назначено - он предназначен только для чтения «

Как я могу (в противном случае) установите Далее этот узел к первому других. узел? Что является причиной этой ошибки? есть ли обходной путь?

+0

Показать примерный пример вашей проблемы как кода. – mybirthname

+0

Вам необходимо использовать методы класса LinkedList. – juharr

+0

Вы не можете. Вам нужно либо добавить второй список в первый, либо создать класс, содержащий свойства, которые будут указывать на другие списки. Класс может наследовать объект LinkList, чтобы вы могли перечислить основной список. – jdweng

ответ

0

вы не можете установить LinkedListNode.Next непосредственно, он доступен только для чтения.

вы также не можете использовать LinkedList.AddLast потому что LinkedlListNode вы пытаетесь для добавления уже находится в списке.

Вам действительно нужно разбить списки и создать новые.

или вы можете реализовать свой собственный список.

0

Каждый узел в реализации Framework LinkedList имеет ссылку на список, содержащий его, что делает перенос элементов в другой список O(n) instead of O(1), что наносит ущерб цели реализации связанного списка. Если вы хотите перенести элементы в другой список в этой реализации, вам придется удалить и добавить их один за другим (используя Remove и AddAfter в списке), чтобы каждый из них получил ссылку на другой список.

Я подозреваю, что это не то, что вам нужно. Как утверждают другие комментарии, потребности вашего списка, вероятно, достаточно просты, что вам будет лучше сделать свой собственный гораздо более простой связанный список. И этот вопрос уже рассмотрен в другом месте на 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); 
    } 
Смежные вопросы