2009-07-29 21 views
2

Ich versuche, Elemente in meiner Liste zu verschieben, aber wenn ich mit der letzten Option vergleiche, gehe ich aus, bevor ich die Elemente in meine Verschiebe-Liste verschiebe. Gibt es eine Möglichkeit, dies zu tun, bevor der Knoten am Ende platziert wird und nicht zum Verschieben der Elemente durchlaufen werden kann?Verschieben von Elementen in verknüpfter Liste 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

Bearbeiten Sie Ihre Frage, wählen Sie den Code Teil und drücken Sie die kleine "Code" -Taste über dem Editor. Das macht den Code viel einfacher zu lesen. – Zyphrax

+0

@ Zyphrax: tat es für sie. –

+0

@ Bruce227: Können Sie vielleicht beschreiben, was Sie erreichen möchten? Möchten Sie die Knoten analysieren, prüfen, ob die DocumentVersionId eines Knotens in der ID-Liste enthalten ist, und diesen Knoten dann ganz nach vorne in die verknüpfte Liste verschieben? – Zyphrax

Antwort

1

Hier ein Beispiel mit ganzen Zahlen hinzugefügt ist, was für mich gearbeitet. Ich habe versucht, andere Sache und denkt für die Hilfe, aber hier ist das, was für mich gearbeitet mehr als nur nach vorne zu bewegen, sondern auch einfach durch die Liste zu bewegen:

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

Ihr Code verschachtelt die beiden Listen - das sieht für mich nicht richtig aus.
denke ich, dass anstelle des Blocks wiederholt

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

Sie

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(); 

, um zu verfolgen, wo Sie das Einfügen wahrscheinlich wie

etwas wollen.

+0

Entschuldigung, dass ich die erste foreach der Bewegung entfernt habe, aber es wurde wieder hinzugefügt. Ich habe versucht, anzurufen, wenn es die Schleife beenden und die Elemente verschieben würde. Ich werde es versuchen und sehen, ob es funktioniert. Danke – Bruce227

+0

Nun, das funktioniert nicht, nur weil es nicht mit dem aktuellen Code zu diesem Teil kommt und nicht aufgerufen wird. Das Problem ist, dass next null ist, weil es am Anfang der Liste steht. also selbst wenn ich den foreach node aufrufen würde, würde ich nicht weiter gehen. previous – Bruce227

+0

1) Mein Refactoring war sinnlos, da es nur sekundär ist, was LinkedList für dich tut (zu viele Erinnerungen an Hand 'C') , Denke ich) 2) statt 'while', mit' do {} while (node! = List.Zuerst); 'würde die zusätzliche Drehung um die Schleife geben. Alternativ folgen Sie der Schleife mit einer unconditional foreach/addFirst. –

0

So ähnlich? (Ich habe versucht, es auf Ihrem Code-Basis):

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; 
    } 
} 

Dieses Stück Code sollte Ihren „DocumentVersionId-matched“ Knoten auf die Vorderseite der verknüpften Liste bewegen.

Unten ist ein Beispiel mit einfachen Zahlen zu zeigen, wie es funktioniert:

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; 
    } 
} 

Das Ergebnis verknüpfte Liste enthält:
1, 4, 5, 7 (die Specials am Anfang der verknüpften Liste), 2, 3, 6, 8

Eine Endlosschleife sollte unmöglich sein.

Antwort bearbeitet:
- Knoten = list.First-Knoten = list.Last
-

+0

Nun werden die Elemente in der Liste nach oben verschoben. es ist nur, wenn ich zuerst umziehen würde, es gab ein Problem. Ich werde deinen Code ausprobieren. Danke – Bruce227

+0

Nope hat eine Endlosschleife mit diesem Code. – Bruce227

+0

@ Bruce227: Ich habe ein einfaches Integer-Beispiel hinzugefügt, um zu zeigen, wie der Code in meiner Antwort funktioniert – Zyphrax

Verwandte Themen