Perché l’aggiunta di un nuovo valore all’elenco sovrascrive i valori precedenti nell’elenco

Seguendo alcune esercitazioni e simili sono stato in grado di creare una class di raccolta che eredita la funzionalità necessaria per creare un DataTable che può essere passato alla stored procedure di un server Sql come parametro del valore di tabella. Tutto sembra funzionare bene; Posso ottenere tutte le righe aggiunte e sembra bello. Tuttavia, dopo un’osservazione più ravvicinata, noto che quando aggiungo una nuova riga, i dati di tutte le righe precedenti vengono sovrascritti con il valore della nuova riga. Quindi se ho una riga con un valore stringa di “pippo” e aggiungo una seconda riga con il valore “bar”, verrà inserita la seconda riga (creando un DataTable con due righe) ma entrambe le righe avranno il valore “bar” “. Qualcuno può capire perché questo sarebbe? Ecco parte del codice, che funziona ma è stato un po ‘semplificato (la class Tag è stata ridotta per facilità di spiegazione).

Quanto segue è la class della raccolta:

using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; using Microsoft.SqlServer.Server; namespace TagTableBuilder { public class TagCollection : List, IEnumerable { IEnumerator IEnumerable.GetEnumerator() { var sdr = new SqlDataRecord( new SqlMetaData("Tag", SqlDbType.NVarChar) ); foreach (Tag t in this) { sdr.SetSqlString(0, t.tagName); yield return sdr; } } } public class Tag { public string tagName { get; set; } } } 

Questi sono chiamati come segue:

 //Create instance of collection TagCollection tags = new TagCollection(); //Create instance of object Tag _tag = new Tag(); foreach (string t in tagList) { //Add value to class propety _tag.tagName = t; //Add class to collection, this is where all previously added rows are overwritten tags.Add(_tag); } 

Stai utilizzando la stessa istanza dell’object Tag all’interno del ciclo, quindi ogni aggiornamento al tagName è lo stesso riferimento. Sposta la dichiarazione all’interno del ciclo per ottenere un nuovo object su ciascun passaggio del ciclo:

 foreach (string t in tagList) { Tag _tag = new Tag(); //Add value to class propety _tag.tagName = t; //Add class to collection, this is where all previously added rows are overwritten tags.Add(_tag); } 

Notate anche che ho aggiornato l’ultima riga per aggiungere _tag posto di mTag perché non lo vedo definito da nessuna parte.

Nel ciclo in cui aggiungi i tag alla raccolta, stai utilizzando la stessa istanza di object Tag. In sostanza, stai impostando il nome di un tag sul primo valore in tagList e aggiungendolo alla raccolta, quindi stai cambiando lo stesso nome del tag sul secondo valore in tagList e lo aggiungi nuovamente alla raccolta.

La tua collezione di Tag contiene diversi riferimenti allo stesso object Tag! Crea un’istanza di _tag all’interno del ciclo for ogni volta prima di impostare il nome del tag e aggiungerlo alla raccolta.