2017-03-15 1 views
0

Ich habe den Einfügesortieralgorithmus in C# implementiert. Das Verfahren zur Herstellung eines List<List<string>> kehrt die alle Schritte aufzeichnet und verändert, dass die List Variablen erfahren, die ausgewählt wurden, usw.C#: Beim Hinzufügen eines Elements zu einer Liste werden die vorherigen Listenelemente ebenfalls mit dem Element überschrieben. Warum?

Dies ist die Methode:

public List<List<int>> SortStepByStep(List<int> set) 
{ 
    List<List<int>> steps = new List<List<int>>(); 
    steps.Add(set); 

    for (int c1 = 1; c1 < set.Count; c1++) 
    { 
     Console.WriteLine(steps[0][0].ToString()); 

     int item = set[c1]; 

     set.Add(item); 
     steps.Add(set); 
     set.RemoveAt(set.Count - 1); 
     // ^^^^ This is just to visually display what number is being selected. 

     set.RemoveAt(c1); 

     steps.Add(set); 

     bool inserted = false; 
     for (int c2 = 0; c2 < c1; c2++) 
     { 
      if ((set[c2] > item || c2 == c1 - 1) && !inserted) 
      { 
       set.Insert((set[c2] <= item && (c2 == c1 - 1) ? c2 + 1 : c2), item); 
       steps.Add(set); 
       inserted = true; 
       break; 
       // Added the break in anyway because sometimes the inserted boolean failed to work. 
      } 
     } 
    } 
    return steps; 
} 

Was die Methode tatsächlich zurückgibt, ist nur die letzte sortiert Liste bei jedem Index von 'Schritten'. Ich habe es mit dem Schreiben der 'Schritte' zur Konsole durchgegangen und kann sehen, wie es sich allmählich ändert, aber verstehe nicht warum.

Andere Antworten erwähnen Instanziierung innerhalb der for-Schleife, aber ich denke nicht, dass das hier anwendbar ist.

Was könnte das Problem sein?

+1

Das Problem ist, dass Sie ein und dasselbe Listenobjekt ** Referenz ** zu Ihren 'Schritten' hinzufügen (es macht keine Kopie für Sie). Ersetze ** alle ** 'steps.Add (set);' with 'steps.Add (set.ToList());' –

+1

Vielen Dank, ich habe nicht verstanden, dass das so funktioniert hat. Danke, dass du mir viel Zeit gespart hast! –

Antwort

1

Ihre Schritte Liste mit Referenzen in der gleichen Sammlung. Wenn Sie also ändern, zeigt jedes Element der Schritte Ihnen aktualisierten Wert (sie zeigen auf das gleiche Objekt).

Versuchen Sie, steps.Add(set); zu steps.Add(set.ToList()) oder steps.Add(new List<int>(set)) zu ändern, die neue Liste erstellen sollte, anstatt auf alte zu verweisen.

+0

Vielen Dank für die Antwort, ich muss etwas genauer in die Theorie/msdn Seiten lesen! –

Verwandte Themen