2012-03-27 29 views
0

Ich habe eine Anwendung, die mehrere Listen hat, um einige Werte während der Ausführung der Anwendung zu verfolgen. Insbesondere hat es List1, List2 und MainList.Aktualisieren einer Liste von Listen

List1 und List2 sind vom Typ String und MainList ist eine Liste der 2 anderen Listen.

In meiner Anwendung möchte ich die Werte der Listen aktualisieren und ändern, während die Anwendung läuft, aber ich habe Probleme herauszufinden, wie dies zu tun ist.

Es ist eine Bildbearbeitung Anwendung, die Fotos aus einer Datei verarbeitet. Die Anwendung muss die Werte der Listen für alle Fotos in der Datei verarbeiten. Daher wird es eine Schleife haben, die über alle Fotos iteriert und die Listen mit jeder Iteration aktualisiert.

Mein Algorithmus sollte wie folgt aussehen: * Wenn es das erste Bild ist, fügen Sie die Zeichenfolgen zu List1. Fügen Sie anschließend List1 zu MainList hinzu * Fügen Sie für jedes fortlaufende Bild die Zeichenfolgen zu List2 hinzu. Fügen Sie dann List2 MainList hinzu. Legen Sie List1 als die letzte Liste fest, die MainList hinzugefügt wurde. Löschen List2

Problem ist, dass wenn ich List2-Daten lösche, löscht es auch die Daten für List1, auf die es gesetzt wurde. Wie kann ich das verhindern? Ich habe meinen Code beigefügt, der hoffentlich mehr Sinn ergeben sollte. In meinem Code habe ich die Überprüfungen weggelassen, um zu sehen, ob es das erste Bild ist, da ich gerade den Algorithmus prüfte.

List<List<String>> MainStringList = new List<List<String>>(); 
List<String> StringList1 = new List<String>(); 
List<String> StringList2 = new List<String>(); 

StringList1.Add("My Car"); 
StringList1.Add("My Engine"); 
StringList1.Add("My Wheel"); 

MainStringList.Add(StringList1); 

StringList2.Add("My Flower"); 
StringList2.Add("My Honey"); 
StringList2.Add("My Love Heart"); 

DoStuff(StringList1, StringList2); 

private void DoStuff(List<String> StringList1, List<String> StringList2) 
{ 
    // Perform some calculations 
    // Then add to list 
    MainStringList.Add(StringList2); 

    int mainStringListCount = MainStringList.Count; 

    StringList1 = MainStringList[mainStringListCount - 1]; 

    String test1 = StringList1[2]; 

    StringList2.Clear(); 

    String test2 = StringList1[2];  // Problem is here - clears StringList2 as well as StringList1 
} 
+0

@Hans Moolman StringList2.Clear(); StringList1 wird nicht gelöscht, es sei denn, du sagst StringList1 = StringList2 ... aber ich sehe das nicht in deinem Code ... – NiK

+0

Oops Sorry Leute, gemeint ist, ich mache es in C#. _italic StringList2.Klar(); StringList1 wird nicht gelöscht, es sei denn, Sie sagen StringList1 = StringList2_ Wenn ich StringList2 zu meiner MainList hinzufüge und diese dann zum Festlegen meiner StringList1 verwende, wird sie tatsächlich gelöscht. Ich bin durch den Code gegangen und nach StringList2.Clear() sind meine Werte von StringList1 alle null. Es sei denn, dass ich etwas anderes falsch mache, aber ich kann nichts sehen, was darauf hindeutet, dass ich es bin? – heyred

Antwort

0

Okay, lassen Sie mich durch sie Schritt

MainStringList.Add(StringList2); 
// list count goes up from 1 to 2 

int mainStringListCount = MainStringList.Count; 
// Set mainStringListCount = 2 

StringList1 = MainStringList[mainStringListCount - 1]; 
// Set StringList1 to the reference at index 1 (2 - 1) of your array 
// This sets Stringlist1 to StringList2 since arrays are 0 based. 
// StringList1 and StringList2 now both referece the same list. 

StringList2.Clear(); 
// Clears the list that is referecned by both variables 
0

Hier sind ein paar Probleme, die ich bemerkt habe (wäre dies ein Kommentar gemacht haben, aber es ist zu kompliziert ohne etwas Abstand).

In Ihrem DoStuff() -Methode:

MainStringList.Add(StringList2); 

... dies verleiht ihm einen Objekt Referenzwert-StringList2 zu MainStringList. Ich hoffe du verstehst das. in Ihrer DoStuff Methode

StringList1 = MainStringList[mainStringListCount - 1]; 

... dies wird den letzten Wert MainStringList hinzugefügt, das ist, was Sie gerade in der ersten Zeile des Codes hinzugefügt.

der zweiten bis letzten Zeile in dem Verfahren ist:

StringList2.Clear(); 

StringList1 ist ein Stapel Bezugnahme auf die exakt gleiche Objekt, das StringList2 ‚s Stapel Bezugnahme auf weist. Im Wesentlichen haben Sie also eine Liste, mit der Sie tatsächlich arbeiten, und am Ende ist sie komplett leer, weil Sie Clear() auf der Stack-Referenz aufgerufen haben, die auf das einzige Heap-Objekt List verweist. Sie müssen neue List Objekte erstellen, anstatt immer wieder mit demselben zu arbeiten.

EDIT: Derp, schlug Jodrell mich.

+0

Nun, Ihre Antwort ist auch richtig – Jodrell

Verwandte Themen