2012-11-07 5 views
5

Ho creato una coppia di classi personalizzate (NTDropDown e NTBaseFreight) che uso per memorizzare i dati che richiamo da un DB. Inizializzo un elenco di NTBaseFreight e 2 elenchi per NTDropDown.list.add sembra aggiungere un riferimento all'oggetto originale?

posso utilizzare con successo List.Add per aggiungere carichi alla lista noli, ma come il debug del codice, i miei 2 elenchi a discesa contenere solo 1 NTDropDown, che ha sempre gli stessi valori NTDropDown (Sto assumendo questo è un riferimento problema, ma cosa sto sbagliando?

per fare un esempio, in seconda fila, se il vettore e carrier_label erano "001", "MyTruckingCompany" e ho messo una pausa sulla if per frt_carriers, sia frt_carriers e frt_modes avrebbero contenere soltanto 1 articolo nella loro lista, con i valori "001", "MyTruckingCompany" ... gli stessi valori in NTDropDown.

Codice:

List<NTDropDown> frt_carriers = new List<NTDropDown>(); 
List<NTDropDown> frt_modes = new List<NTDropDown>(); 
List<NTBaseFreight> freights = new List<NTBaseFreight>(); 
NTDropDown tempDropDown = new NTDropDown(); 
NTBaseFreight tempFreight = new NTBaseFreight(); 

//....Code to grab data from the DB...removed 

while (myReader.Read()) 
{ 
    tempFreight = readBaseFreight((IDataRecord)myReader); 

    //check if the carrier and mode are in the dropdown list (add them if not) 
    tempDropDown.value = tempFreight.carrier; 
    tempDropDown.label = tempFreight.carrier_label; 
    if (!frt_carriers.Contains(tempDropDown)) frt_carriers.Add(tempDropDown); 

    tempDropDown.value = tempFreight.mode; 
    tempDropDown.label = tempFreight.mode_label; 
    if (!frt_modes.Contains(tempDropDown)) frt_modes.Add(tempDropDown); 

    //Add the freight to the list 
    freights.Add(tempFreight); 
} 
+2

ok, ho capito ... Ho bisogno di inizializzare un NUOVO NTDropDown ogni volta (non riutilizzare tempDropDown più e più volte). quindi, aggiungendo 'tempDropDown = new NTDropDrop();' prima di usarlo ogni volta. Dovrei cancellare questa domanda? –

+0

No. Lascia la domanda. Risolvere la tua domanda è ancora utile a tutti. – hometoast

risposta

9

Sì, un elenco di tipi di riferimento è in realtà solo un elenco di riferimenti.

È necessario creare una nuova istanza per ciascun oggetto che si desidera memorizzare nell'elenco.

Inoltre, il metodo Contains confronta i riferimenti, quindi due oggetti contenenti gli stessi dati non sono considerati uguali. Cerca un valore nelle proprietà degli oggetti nell'elenco.

if (!frt_carriers.Any(c => c.label == tempFreight.carrier_label)) { 
    NTDropDown tempDropDown = new NTDropDown { 
    value = tempFreight.carrier, 
    label = tempFreight.carrier_label 
    }; 
    frt_carriers.Add(tempDropDown); 
} 
4

tempDropDown è lo stesso oggetto per tutto il ciclo. Sarà necessario crearne una nuova se si desidera aggiungerne più di una.

Sto attraversando un periodo difficile cercando di capire cosa esattamente stai cercando di aggiungere che tempDropDown è la lista.

+0

Sì, ero confuso perché non causava alcun problema con il mio oggetto freights, ma perché stavo ottenendo un nuovo oggetto ogni iterazione dalla funzione readBaseFreight) ... –

+0

a dire il vero, non era una mia idea .. .l'elenco dei carichi viene restituito in JSON (verrà utilizzato da un'app) e mi è stato detto di creare un elenco separato di tutti i valori possibili per ogni vettore/modalità in modo che l'utente possa filtrare ulteriormente i risultati (se lo desiderano) ... per me, avrebbe senso che la lista di valori unici venisse creata dall'app ... dovrei solo restituire l'elenco dei carichi ... ma ... sì ... –

Problemi correlati