2009-07-29 2 views
2

Я пытаюсь переместить элементы в моем списке, но когда я сравниваю последний вариант, я выхожу, прежде чем переместить элементы в свой список, связанный с перемещением. Есть ли способ сделать это до того, как узел будет вставлен в конец и не сможет выполнить цикл для перемещения элементов?Перемещение элементов в связанном списке C# .NET

LinkedList<BD> list = new LinkedList<BD>(b[arg].Values); 
LinkedListNode<BD> node, terminator, next = null; 
List<LinkedListNode<BD>> move = new List<LinkedListNode<BD>>(); 

terminator = list.First; 
node = next = list.Last; 

while (next != null && next != terminator) 
{ 
    node = next; 
    next = next.Previous; 
    if (IDs.Contains(node.Value.Id)) 
    { 
     move.Add(node); 
     list.Remove(node); 
    } 
    else 
    { 
     foreach (var item in move) 
     { 
      list.AddBefore(node, item); 
      node = node.Previous; 
     } 
     move.Clear(); 
    } 
} 
+1

Пожалуйста редактировать свой вопрос, выберите кодовую часть и нажмите маленький «код» над редактором. Это делает код намного легче читать. – Zyphrax

+0

@ Zyphrax: сделал это для них. –

+0

@ Bruce227: Не могли бы вы описать, что вы пытаетесь выполнить? Вы хотите проанализировать узлы, проверить, находится ли файл DocumentVersionId узла в списке идентификаторов, а затем переместить этот узел в самую переднюю часть связанного списка? – Zyphrax

ответ

1

Вот что работает для меня. Я пробовал разные вещи и думает, что за помощь, но вот то, что работает для меня больше, чем просто перемещение на фронт, но и просто перемещение по списку:

while (next != null) 
{ 
    node = next; 
    next = next.Previous; 

    if (IDs.Contains(Id)) 
    { 
     move.Add(node); 
     list.Remove(node); 
    } 
    else 
    { 
     foreach (var item in move) 
     { 
     list.AddBefore(node, item); 
     node = node.Previous; 
     } 
     move.Clear(); 
    } 

    if (next == null) 
    { 
     foreach (var item in move) 
     { 
     list.AddFirst(item); 
     } 
     move.Clear(); 
    } 
} 
0

Ваш код чередует два списка - это не выглядит правильным для меня.
Я думаю, что вместо повторяемого блока

foreach (var item in move) 
{ 
    list.AddBefore(node, item); 
    node = node.Previous; 
} 
move.Clear(); 

вы, вероятно, хотите что-то вроде

var before = node.Previous; 
    var LinkedListNode<BD> current = null; 
    foreach (var item in move) 
    { 
     list.AddBefore(node, item); 
     current = node = item; 
    } 
    current.Previous = before; // assumes move was not empty 
    move.Clear(); 

, чтобы отслеживать, где вы вставки.

+0

Извините, что я удалил первый файл foreach, но он был добавлен обратно. Я пытался позвонить, если он собирается закончить цикл и переместить элементы. Я дам вам попробовать и посмотреть, работает ли он. Спасибо – Bruce227

+0

Ну, это не работает только потому, что он не попадает в эту часть с текущим кодом и не вызывается. проблема в том, что next является нулевым, потому что он находится в начале списка. так что даже если я вызываю узел foreach, больше не будет идти с .previous – Bruce227

+0

1) Мой рефакторинг был бессмысленен, так как он просто вторгается в то, что LinkedList делает для вас (слишком много воспоминаний об руку «C», , Я думаю) 2) вместо 'while', используя' do {} while (node! = List.Сначала), 'даст дополнительный поворот вокруг цикла. Альтернативно, следуйте за циклом безусловным foreach/addFirst. –

0

Что-то вроде этого? (Я попытался ее на основе кода):

LinkedList<BD> list = new LinkedList<BD>(b[arg].Values); 
LinkedListNode<BD> node = list.Last; 
LinkedListNode<BD> terminator = null; 

while (node != null && node != terminator) { 
    if (IDs.Contains(node.Value.DocumentVersionId)) { 
     LinkedListNode<BD> tempNode = node; 
     node = node.Previous; 

     list.Remove(tempNode); 
     list.AddFirst(tempNode); 
     if (terminator == null) terminator = tempNode; 
    } else { 
     node = node.Previous; 
    } 
} 

Этот фрагмент кода должен переместить свой «DocumentVersionId-совпавшие» узлы передней части связанного списка.

Ниже приведен пример с простыми числами, чтобы показать, как это работает:

List<int> specials = new List<int> { 1, 4, 5, 7 }; 
List<int> source = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 }; 
LinkedList<int> list = new LinkedList<int>(source); 

LinkedListNode<int> node = list.Last; 
LinkedListNode<int> terminator = null; 

while (node != null && node != terminator) { 
    if (specials.Contains(node.Value)) { 
     LinkedListNode<int> tempNode = node; 
     node = node.Previous; 

     list.Remove(tempNode); 
     list.AddFirst(tempNode); 
     if (terminator == null) terminator = tempNode; 
    } else { 
     node = node.Previous; 
    } 
} 

Результат связанный список будет содержать:
1, 4, 5, 7 (экстренное в начале связанного списка), 2, 3, 6, 8

Бесконечный цикл должен быть невозможным.

Ответ редактирует:
- узел = list.First в узел = list.Last
- добавил пример с целыми числами

+0

хорошо перемещаются вверх по списку. это просто, если я перехожу к первой, возникла проблема. я попробую ваш код. Спасибо – Bruce227

+0

nope получил бесконечный цикл с этим кодом. – Bruce227

+0

@ Bruce227: Я добавил простой пример целого числа, чтобы показать, как работает код в моем ответе. – Zyphrax

Смежные вопросы