2013-11-21 9 views
10

Ich habe einige seltsame Probleme mit List in meiner C# -App. Es muss ein Zuteilungsfehler sein oder dass ich etwas falsch mache (ich bin ein durchschnittlicher C# -Entwickler). Lassen Sie mich ein Beispiel geben nah an meine Linien:C# "lustige" Probleme mit der Liste <String[]>

List<String[]> MyPrimaryList = new List<String[]>(); 
List<String[]> MySecondaryList = new List<String[]>(); 
String[] array; 

String arrayList = "one,two,three,four,five"; 
array = arrayList.Split(','); 

MyPrimaryList.Add(array); 
MySecondaryList.Add(array); 

MyPrimaryList[0][0] += "half"; 

So, jetzt würde ich zum ersten Wert in der ersten Reihe in MyPrimaryList erwarten zu sein „onehalf“ und „Eins“ in MySecondaryList. Aber mein Problem/Problem ist, dass beide Listen mit "onehalf" als ersten Wert im ersten Array in beiden Listen aktualisiert wird.

Haben Sie eine gute Erklärung? :)

DANKE !!

+1

Sie das gleiche Array beiden Listen hinzufügen, so Sie zeigen beide auf das Array-Element, das Sie ändern. –

+0

Sie fügen das gleiche Objekt zu beiden Listen hinzu - mit anderen Worten, es gibt nur ein 'Array', das Sie nirgends kopieren ... – tpeczek

Antwort

18

String[] array; ist ein Referenztyp. Sie haben in beiden Listen einen Verweis auf den Speicherort dieses Objekts hinzugefügt, daher enthalten beide die gleichen Daten.

Wenn Sie die zweite Liste benötigen eine Kopie der array haben, dann können Sie Array.Copy verwenden:

List<String[]> MyPrimaryList = new List<String[]>(); 
List<String[]> MySecondaryList = new List<String[]>(); 

String arrayList = "one,two,three,four,five"; 
String[] array = arrayList.Split(','); 
String[] array2 = new string[5]; 

Array.Copy(array, array2, 5); 

MyPrimaryList.Add(array); 
MySecondaryList.Add(array2); 

MyPrimaryList[0][0] += "half"; 

Console.WriteLine(MyPrimaryList[0][0]); 
Console.WriteLine(MySecondaryList[0][0]); 

Dies nimmt den Source-Array, ein Zielfeld und Länge - vorsichtig sein, die Feldgrenzen zu überprüfen.

Diese Ausgänge:

onehalf 
one 

Da jede Liste nun einen Verweis auf ein anderes Array enthält, können Sie die Array-Elemente unabhängig manipulieren.

9

Sie fügen beiden Listen die gleiche Instanz des Arrays hinzu, sodass sie auf dieselbe Speicherstruktur verweisen.

Wenn Sie wollen, dass sie unabhängig sind, dann müssten Sie sie klonen; Ein schneller Weg von der Spitze meines Kopfes wäre mit linq list.Add(array.ToArray()) in einer der Listen

+1

' .Auswählen (x => x) 'wird nicht benötigt seit' string [] 'implementiert bereits' IEnumerable '. –

+0

@Eren, Sie haben Recht, ich habe es so gemacht, weil nicht 100% sicher war, dass ToArray ein Array aufgerufen hat, eine neue Kopie zurückgeben würde. Aber ich habe es überprüft und so funktioniert es –

7

Arrays sind Referenzobjekte, so dass Sie die gleiche Sammlung im Speicher ändern. Alles, was Sie im Wesentlichen tun, ist Zeiger auf die gleiche Struktur Hinzufügen

Werfen Sie einen Blick auf diese Dokumentation

Passing Arrays as Arguments (C# Programming Guide)

Sie müssen eine tiefe Kopie des Arrays tun wollen, die Autonomie Sie zu erhalten.

Sie können dies tun, mit Array.Copy

0

Sie ein Array für jede Liste erstellen sollten Sie arbeiten, weil jetzt Sie an der gleichen Speicherstruktur

der richtige Code sein verweisen sollte:

List<String[]> MyPrimaryList = new List<String[]>(); 
List<String[]> MySecondaryList = new List<String[]>(); 
String[] array; 
String[] secondaryArray; 

String arrayList = "one,two,three,four,five"; 
array = arrayList.Split(','); 
secondaryArray = arrayList.Split(','); 

MyPrimaryList.Add(array); 
MySecondaryList.Add(secondaryArray); 

MyPrimaryList[0][0] += "half"; 

jetzt Ihre zweite Liste wird „one“ und nicht „onehalf“ als erstes Element

0

wie erwähnt Array ist eine Typenbezeichnung und daher würde sowohl die Liste den gleichen Array zeigt


Ihr Problem Clone Methode zu lösen ..

MyPrimaryList.Add((String[])array.Clone()); 
MySecondaryList.Add((String[])array.Clone()); 

Obwohl es eine flache Kopie des Arrays tun würde, aber es ist geeignet in Ihrem Fall