2013-10-03 1 views
5

Ich habe ein Problem mit Blick auf ein IList Hinzufügen von Daten, aber das Problem ist, jedes Mal, wenn ich Daten der vorhandenen Daten hinzugefügt mit dem aktuellen überschrieben wird mein Code unten gegeben:IList.Add() Überschreiben vorhandene Daten

Test test = new Test(); 
IList<Test> myList = new List<Test>(); 

foreach (DataRow dataRow in dataTable.Rows) 
{ 
    test.PatientID = Convert.ToInt64(dataRow.ItemArray[0]); 
    test.LastName = dataRow.ItemArray[1].ToString(); 
    test.FirstName = dataRow.ItemArray[2].ToString(); 
    myList.Add(test); 
} 

Was ist der Grund dafür?

+0

http://msdn.microsoft.com/en-us/library/490f96s2.aspx –

+2

Das Problem, das Sie als dieser Test haben, ist ein Referenztyp nicht ein Werttyp, wenn Sie Test zu der Liste hinzufügen, fügen Sie einen Zeiger auf den Speichertest sitzt in, wenn Sie dann die nächste Schleife ausführen Sie die Änderungen vornehmen Dieser Speicherbereich überschreibt die Daten der vorherigen Schleife. Aus diesem Grund müssen Sie die Anweisung New in der Schleife verwenden, um einen neuen Speicherplatz für diese Schleife zu reservieren. – MikeT

+0

Vielen Dank für den Hinweis auf meinen Fehler :) – Optimus

Antwort

11

bewegen Testobjekterstellung innerhalb der Schleife

IList<Test> myList = new List<Test>(); 

foreach (DataRow dataRow in dataTable.Rows) 
{ Test test =new Test(); 
    test.PatientID = Convert.ToInt64(dataRow.ItemArray[0]); 
    test.LastName = dataRow.ItemArray[1].ToString(); 
    test.FirstName = dataRow.ItemArray[2].ToString(); 
    myList.Add(test); 
} 

, was Sie derzeit gleichen Augenblick von test innerhalb der Schleife und fügen Sie das gleiche immer wieder ..

4

Sie müssen das die bewegen ist die Aktualisierung zu tun Erstellen des Testobjekts innerhalb der Schleife. Der Grund dafür ist, dass das Objekt new Test() nur einmal instanziiert wird und der Verweis auf das gleiche Objekt immer wieder zur Liste in der Schleife hinzugefügt wird.

3

Weil Test test durch Verweis kopiert wird. Sie müssen es innerhalb der Schleife verschieben.

tun es wie folgt

IList<Test> myList = new List<Test>(); 
foreach (DataRow dataRow in dataTable.Rows) 
{ 
    Test test =new Test(); 
    test.PatientID = Convert.ToInt64(dataRow.ItemArray[0]); 
    test.LastName = dataRow.ItemArray[1].ToString(); 
    test.FirstName = dataRow.ItemArray[2].ToString(); 
    myList.Add(test); 
} 
2

Weil Sie in foreach-Schleife neue Instanz nicht schaffen, korrigieren Sie den Code:

Test test = null; 
IList<Test> myList = new List<Test>(); 

foreach (DataRow dataRow in dataTable.Rows) 
{ 
    test = new Test(); 
    test.PatientID = Convert.ToInt64(dataRow.ItemArray[0]); 
    test.LastName = dataRow.ItemArray[1].ToString(); 
    test.FirstName = dataRow.ItemArray[2].ToString(); 
    myList.Add(test); 
} 
2

Sie die gleiche Bezugsgröße verwendet (Test) alle die Zeit. Versuchen Sie, in Ihrer Schleife einen neuen Test() zu erstellen.

1

Sie eine einzelne Instanz Test

Test test = new Test(); // This is your instance 
IList<Test> myList = new List<Test>(); 

foreach (DataRow dataRow in dataTable.Rows) 
{ 
    // Here you change the values of the existing instance each time you loop 
    test.PatientID = Convert.ToInt64(dataRow.ItemArray[0]); 
    test.LastName = dataRow.ItemArray[1].ToString(); 
    test.FirstName = dataRow.ItemArray[2].ToString(); 
    myList.Add(test); // but you are still just adding the same reference to the list multiple times 
} 

erstellen und dann, da Sie nie eine neue Test Instanz erstellen, die Sie hinzufügen den gleichen Verweis auf die Liste mehrere Male. Dies bedeutet, dass Sie im Wesentlichen nur das gleiche Objekt immer wieder speichern: Wenn Sie Änderungen an einem Element in der Liste vornehmen, wird es sofort in allen anderen Objekten sichtbar sein, da sie im Wesentlichen das gleiche Objekt sind

Die Lösung besteht darin, zu verschieben die Instantiierung Test innerhalb der Schleife

IList<Test> myList = new List<Test>(); 

foreach (DataRow dataRow in dataTable.Rows) 
{ 
    Test test = new Test(); // Each loop iteration will now create a new instance of Test 
    test.PatientID = Convert.ToInt64(dataRow.ItemArray[0]); 
    test.LastName = dataRow.ItemArray[1].ToString(); 
    test.FirstName = dataRow.ItemArray[2].ToString(); 
    myList.Add(test); 
} 

Wenn Sie diese besser verstehen müssen, schauen Sie sich Referenz- und Werttypen in .NET und Weitergabe von reference/Wert

Wert und Ref-Typen in .NET: http://msdn.microsoft.com/en-us/library/t63sy5hs.aspx

Einige Informationen über Zeiger auf Wikipedia http://en.wikipedia.org/wiki/Pointer_(computer_programming)

Verwandte Themen