Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    (C#) Riempire l'ArrayList...

    Ciao ragazzi,
    sono nuovo di C# ma conosco il Java, e sono sorpreso dalle somiglianze tra questi due linguaggi! La gestione degli ArrayList è abbastanza diversa, ed infatti è lì che ho incontrato i primi problemi.

    Situazione: Query su un database, estraggo un record alla volta, ogni record lo faccio diventare un array di stringhe dove ogni stringa è un campo del record, poi infilo ogni record in un arraylist.
    Alla fine, ottengo che l'arraylist è riempito sempre con lo stesso valore, e non capisco quale è il problema: se nella stampa o nel riempimento.

    Il codice: [ Creazione dell'ArrayList]



    codice:
    SqlDataReader myReader = cmd.ExecuteReader();
                
                String[] rec = new String[11];
                ArrayList tot = new ArrayList();
                
    
    
                while (myReader.Read())
                {
                    
                    for (int p = 0; p < 11; p++) {
                        Console.WriteLine("Entro nel for");
                        if (p == 0||p==1||p==2||p==3||p==4) rec[p] = myReader.GetString(p);
                        else if (p == 5 || p == 7 || p == 9)
                        {
                           SqlDateTime temp = myReader.GetSqlDateTime(p);
                            rec[p] = temp.ToString().Substring(0, 10);
                        }
                        else if (p == 6 || p == 8 || p == 10)
                        {
                            SqlDateTime temp = myReader.GetSqlDateTime(p);  
                            rec[p] = temp.ToString().Substring(11, 8);
                        }
                        
                    
                    }
                    
                    tot.Add(rec);
                }
    Stampa:

    codice:
    for (int i = 0; i < tot.Count; i++) { 
    
            string[] value = tot[i] as string[]; 
             Console.WriteLine(value[0]); }
    Grazie a chiunque volesse darmi una mano....

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Alla fine, ottengo che l'arraylist è riempito sempre con lo stesso valore.....
    Non può essere lo stesso valore visto che l'arrayList è composto da matrici di stringhe.

    e non capisco quale è il problema: se nella stampa o nel riempimento.
    Mi sembra nella stampa, anche se non capisco cosa vuoi leggere

    codice:
    for (int i = 0; i < tot.Count; i++) { 
            string[] value = tot[i] as string[]; 
             Console.WriteLine(value[0]); }
    Mi sembra di vedere, con il codice che hai scritto, che leggi solo il primo valore di ogni matrice. (value[0] ). A mio parere il modo corretto di vedere tutti gli elemti delle matrici potrebbe essere:

    codice:
    for (int i = 0; i < tot.Count; i++)
                    {
                        string[] value = tot[i] as string[];
                        for (int c = 0; c < value.GetUpperBound (0); c++)
                        {
                            Console.WriteLine(value[c]);
                        }                  
                    }
    Sbagliare è umano, perseverare è diabolico.

  3. #3
    Innanzitutto ti ringrazio per la risposta.

    In effetti sono stato poco chiaro nella domanda.

    Nella domanda ho riportato il codice della stampa che sto usando per testare, stampa solo il primo valore dell'array estratto, cioè la chiave primaria; stampa sempre lo stesso valore!

    Per curiosità ho provato ad usare il tuo codice, e confermo che il programma stampa n volte lo stesso record, dove n è il numero dei record estratti con la query.

    A questo punto il problema forse è nell'inserimento dei valori, ma, facendo così:

    codice:
     
    
    String[] rec = new String[11];
                ArrayList tot = new ArrayList();
                while (myReader.Read())
                {
                    
                    for (int p = 0; p < 11; p++) {
                        Console.WriteLine("Entro nel for");
                        if (p == 0||p==1||p==2||p==3||p==4) 
    rec[p] = myReader.GetString(p);
                        else if (p == 5 || p == 7 || p == 9)
                        {
                           SqlDateTime temp = myReader.GetSqlDateTime(p);
                            rec[p] = temp.ToString().Substring(0, 10);
                        }
                        else if (p == 6 || p == 8 || p == 10)
                        {
                            SqlDateTime temp = myReader.GetSqlDateTime(p);  
                            rec[p] = temp.ToString().Substring(11, 8);
                        }
                        Console.WriteLine("indice: " +p +" valore: "+rec[p]);
                    
                    }
                    Console.WriteLine("Fuori dal for, aggiungo il record");
                    tot.Add(rec);
                }

    Le Console.WriteLine() stampano i valori corretti..salvo poi ritrovarmi, nella stampa per la verifica, un araylist con n record (n= numero di record estratti) uguale all'ultimo!!

    Il mistero si infittisce......

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Considerando che il codice hai postato per popolare l'arrayList mi sembri corretto, ovvero popoli una matrice di stringhe di 11 elementi per poi aggiungerla, a fine ciclo all'arryList.
    Ho provato pure io il codice, senza ovviamente il database che non ho, ma immagazzinando numeri incrementali e l'arrayList viene popolato correttamente.
    1-Hai provato ad inserire dei Breackpoints nel codice e vedere cosa legge e cosa scrive??
    2-Dove leggi l'arrayList ?-
    Sbagliare è umano, perseverare è diabolico.

  5. #5
    Ho provato ad inserire questo codice

    codice:
    tot.Add(rec);
    Console.WriteLine("Stampo il record appena aggiunto");
    string[] ott = new string[11]
    ott = (string[])tot[tot.Count-1]);
    
    for (int j = 0; j < 11; j++) {
                        Console.Write(ott[j]+" ");
                    }
    Console.WriteLine("\n");
    Ogni volta viene stampato il record corretto, quindi l'arraylist sembrerebbe popolato correttamente.

    Poi, per provare, faccio

    codice:
                 string[] value = tot[0] as string[];
    
                Console.WriteLine(value[0]);
    
                 value = tot[40] as string[];
                Console.WriteLine(value[0]);
                value = tot[tot.Count-1] as string[];
                Console.WriteLine(value[0]);
    cioè stampo la chiave primaria del primo elemento, del 41esimo e dell'ultimo...ebbene....stampa sempre la stessa cosa!!!

    Ho cambiato l'implementazione, sono passato ad un array bidimensionale di stringhe, e funziona regolarmente...mi sento un cretino, non riesco davvero a venirne a capo!

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Non hai risposto alle mie due domande!
    Sbagliare è umano, perseverare è diabolico.

  7. #7
    Mi sembrava di aver risposto col mio ultimo post, riportando i break point per leggere ciò che c'era nell'arraylist!

    Per la cronaca, ho risolto...c# è davvero diabolico! Il passaggio di parametri è fatto completamente per riferimento, per cui, quando faccio

    codice:
    tot.add(rec)
    viene accodato a tot il riferimento a rec.

    Nell'iterazione successiva del while, rec cambia il contenuto, e viene riaccodato a tot.

    Ora tot contiene due riferimenti alla stessa parte di memoria!!

    Alla fine, tot sarà formato da n riferimenti a rec, che, ovviamente, contiene il valore dell'ultimo aggiornamento!

    Per risolvere, ho spostato l'istruzione

    codice:
    String[] rec = new String[11];
    all'interno del while, in modo che, ad ogni iterazione, viene creato in memoria un nuovo oggetto, ed è quello che viene accodato!

    Non no se sia possibile passare in c# i parametri per valore e non per riferimento, ora vado a vedere

    Grazie per l'aiuto,
    a buon rendere!

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    970
    Bravo, piccola svista ma anche in VB.NET è così!

    E' il tipo di variabile che è tipo riferimento, non il modo in cui si passa.
    Sbagliare è umano, perseverare è diabolico.

  9. #9
    Alla fine, ho risolto in modo ancora più semplice:

    codice:
    tot.Add(rec.Clone());
    Anche in java il tipo è un riferimento, ma non c'è bisogno di esplicitare di aggiungere il clone dell'oggetto..

  10. #10
    mi autorispondo, ho controllato del codice scritto tempo fa in java e anche lì ho dovuto fare il clone...funzionano nella stessa maniera allora!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.