2013-10-03 15 views
5

Sto affrontando un problema di aggiungere dati a un IList ma il problema è ogni volta ho aggiunto i dati i dati esistenti viene sovrascritto con quello attuale il mio codice è il seguente:IList.Add() sovrascrivere i dati esistenti

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

Qual è la ragione di questo?

+0

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

+2

il problema che si sta verificando è un tipo di riferimento e non un tipo di valore, quando si aggiunge test all'elenco che si aggiunge un puntatore al test della memoria, quando si esegue il ciclo successivo si apportano le modifiche in quello spazio di memoria sovrascrive i dati dal ciclo precedente, per questo è necessario utilizzare la nuova statistica all'interno del ciclo per allocare un nuovo spazio di memoria per il ciclo da utilizzare – MikeT

+0

Grazie tutto per aver segnalato il mio errore :) – Optimus

risposta

11

mossa creazione oggetto di prova all'interno del ciclo

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

quello che attualmente facendo è l'aggiornamento stesso istante del test all'interno del ciclo e aggiungere più e più volte lo stesso ..

4

È necessario spostare il la creazione dell'oggetto Test all'interno del loop. Il motivo è che l'oggetto new Test() viene istanziato una sola volta e il riferimento allo stesso oggetto continua ad essere aggiunto all'elenco nel loop.

3

Perché il Test test viene copiato dal riferimento. Hai bisogno di spostarlo all'interno del ciclo.

fare in questo modo

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

Perché non si crea nuova istanza nel ciclo foreach, correggere il codice:

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

State usando la stessa variabile di riferimento (test) tutto il tempo. Prova a crettare il nuovo Test() nel tuo loop.

1

Si sta creando una singola istanza di 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 
} 

E poi dal momento che non si è mai creando un nuovo Test esempio, si aggiunge lo stesso riferimento alla lista più volte. Ciò significa che in pratica si sta semplicemente memorizzando lo stesso oggetto: se si apportano modifiche a un elemento nell'elenco sarà immediatamente visibile in tutti gli altri perché sono essenzialmente lo stesso oggetto

La soluzione è spostare l'istanza di prova all'interno del ciclo

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

Se avete bisogno di capire meglio questo, guardare i tipi di riferimento e il valore in .NET e il passaggio per riferimento/valore

tipi di valore e Ref in .NET: http://msdn.microsoft.com/en-us/library/t63sy5hs.aspx

Alcune informazioni su puntatori su Wikipedia http://en.wikipedia.org/wiki/Pointer_(computer_programming)

Problemi correlati