C# - Dictionary e dati di diverso tipo

giovedì 08 aprile 2010 - 18.43

lexen Profilo | Newbie

Salve,
esiste qualcosa tipo dictionary che accetti dati di diverso tipo?

esempio

un dictionary che accetti dati string, int, e bool tutti insime.

Grazie

kataklisma Profilo | Senior Member

>Salve,
Salve!

>esiste qualcosa tipo dictionary che accetti dati di diverso tipo?
>
>esempio
>
>un dictionary che accetti dati string, int, e bool tutti insime.

Pensare ad una maggiore generalizzazione di una classe che per sua natura è già una classe Generic mi sembra un po strano :)

Comunque sia potresti spiegare perchè ti serve una cosa del genere, magari riusciamo a capire le tue esigenze.

Tieni comunque conto che una classe generica<T> ha bisogno al momento della creazione dell'istanza di un tipo, appunto T, e non è possibile inserire QUALSIASI cosa li dentro se la classe viene istanziata ed esempio di tipo Int.

L'unica soluzione che riesco a trovare date le tue spiegazioni è che hai bisogno di istanziare una dictionary in questo modo :

Dictionary<Object,Object> Dict = new Dictionary<Object,Object>();

>Grazie
Di niente ;)

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

lexen Profilo | Newbie

Ciao a tutti e grazie per la repentina risposta.
Cerco di essere piu chiaro.
Il mio problema è che ho bisogno di estrarre, tramite un metodo di un oggetto da me creato, i dati dell l'ultimo record inserito in una tabella di un database Sql server. Ho pensato di gestire il tutto in questo modo:
la riga estratta dalla tabella la inserisco in un Dictionary dove la "key" del dictionary è uguale al nome della colonna del record e il "value" corrispondente all "Key" gli associo il contenuto della cella del record.
Quindi nel mio dictionary avrò tante key che corrispondono ai nomi delle colonne del record della tabella.
Passo successivo è semplicemente quello di scorrere il dictionary ritornato dal metodo e aggiornare i vari controlli situati sulla Windows Form .
esempio:
txtNome=dic["NOME"];


Come posso fare.
Grazie

kataklisma Profilo | Senior Member

>Ciao a tutti e grazie per la repentina risposta.
Ciao!

>Cerco di essere piu chiaro.
>Il mio problema è che ho bisogno di estrarre, tramite un metodo
>di un oggetto da me creato, i dati dell l'ultimo record inserito
>in una tabella di un database Sql server. Ho pensato di gestire
>il tutto in questo modo:
>la riga estratta dalla tabella la inserisco in un Dictionary
>dove la "key" del dictionary è uguale al nome della colonna del
>record e il "value" corrispondente all "Key" gli associo il
>contenuto della cella del record.
>Quindi nel mio dictionary avrò tante key che corrispondono ai
>nomi delle colonne del record della tabella.
>Passo successivo è semplicemente quello di scorrere il dictionary
>ritornato dal metodo e aggiornare i vari controlli situati sulla
>Windows Form .
>esempio:
> txtNome=dic["NOME"];
>
>
>Come posso fare.
Se ho capito bene il metodo estrae un solo record alla volta, quindi hai bisogno di un dictionary che accetta una key string ed una value del tipo della colonna!

Nome Cognome Linguaggio
... ... ...
... ... ...
Ignazio Catanzaro C#


Beh, devo dirti la verità non vedo perchè utilizzare strani processi quando puoi semplicemente usare un dictionary cosi dichiarato :


dictionary<string,string> dic = new Dictionary<string,string>(); dic.Add(ValoreColonna,ValoreCella);

Puoi tranquillamente trattare tutto come stringa, anche perchè vedo che l'output avviene in delle textbox.

Il metodo ti ritornerà sia la key sia il value di tipo stringa, li inserisci nel dictionary ed effettui le operezioni.

Comunque sia, lasciando perdere per un momento i dictionary...
Se sai a priori gli headers delle colonne(penso che sia cosi in quanto vai a dare alla textbox txtnome il valore dic["NOME"])
puoi gestire tutto con un semplicissimo ArrayList:

ArrayList arr = new Arraylist();

arr.add(metodoGetValoreCella());


Gli arrayList accettano valori di tipo Object e quindi puoi aggiungere alla collezione stringhe,interi, booleani etc...



Ancora meglio, puoi creare una classe "UltimoRecord" che gestisca il tutto.

public class UltimoRecord()
{
public string Nome { get; set; };
public string Cognome { get; set; };
....
....
}

tramite il metodo acquisisci l'ultimo record, inserisci i valori nelle relative proprietà e richiami l'oggetto quando vuoi.

>Grazie
Di niente!

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

lexen Profilo | Newbie

Ciao,
grazie alle tue direttive ho risolto il problema in gran parte.
Mi manca la parte finale.

Allora ho creato il metodo Estrai_Dati_Ultimo Record()
che ha come parametri d'ingresso la query per estrarre l'ultimo record e la ConnString per aprire la connessione al Database.
Come parametro d'uscita il dictionary di stringhe perchè come da te giustamente suggerito i valori verranno poi associati alle textbox di un form.
Siccome l'applicazione è mono-utente ho deciso di connettermi al database, per estrarre ll'ultimo record, utilizzando la tecnologia DataTable.
La mia principale difficoltà adesso sta nel ricavare a runtime gli headers delle colonne per poi metterle nel dictionary insieme ai valori e creare una cosa tipo:

Dic[Cognome]="Rossi";
Dic[Nome]="Pippo";
Dic[Telefono]="3332123"

Grazie

kataklisma Profilo | Senior Member

>Ciao,
Ciao!

>grazie alle tue direttive ho risolto il problema in gran parte.
>Mi manca la parte finale.
;) vediamo di risolvere anche quella,

>Allora ho creato il metodo Estrai_Dati_Ultimo Record()
>che ha come parametri d'ingresso la query per estrarre l'ultimo
>record e la ConnString per aprire la connessione al Database.
>Come parametro d'uscita il dictionary di stringhe perchè come
>da te giustamente suggerito i valori verranno poi associati
>alle textbox di un form.
>Siccome l'applicazione è mono-utente ho deciso di connettermi
>al database, per estrarre ll'ultimo record, utilizzando la tecnologia
>DataTable.
>La mia principale difficoltà adesso sta nel ricavare a runtime
>gli headers delle colonne per poi metterle nel dictionary insieme
>ai valori e creare una cosa tipo:
>
>Dic[Cognome]="Rossi";
>Dic[Nome]="Pippo";
>Dic[Telefono]="3332123"

Scusami, se conosci a priori le colonne, perchè vuoi ottenere gli header dinamicamente? Comunque sia ti do una dritta ;)

DataSet ds = new DataSet(); ds.Tables[0].Columns[0].ColumnName.ToString();

Se hai problemi chiedi pure :)

>Grazie
Di niente ;)

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

lexen Profilo | Newbie


Utilizzerò questo metodo per tutte le tabelle del database e per tutte le windows form che andro' a realizzare,
infatti sto cercando di parametrizzare il tutto per ottimizzare il codice.
Un'ultima domanda.
E' possibile mettere l'istruzione che mi ha suggerito all'interno di un ciclo "foreach" oppure "for" o "while"
per scorrere automaticamente tutti gli headers delle colenne e i valori in esse.

Grazie
Ti posto il codice da me scritto per renderti la cosa piu chiara.

Sql = "SELECT * FROM articolo where Articolo_id=(SELECT max(articolo_id) FROM articolo)";
cn = new SqlConnection(this.ConnectionString);
cmd = new SqlCommand(Sql, cn);

Dictionary<string, string> dic = new Dictionary<string, string>();

DataTable schemaTable;
String key,valore;


try
{
cn.Open();
SqlDataReader myReader = cmd.ExecuteReader();
schemaTable = myReader.GetSchemaTable();

while (myReader.Read())
{

/* qui dovrei mettere le istruzioni per ricavare il nome colonna e valore contenuto
key = ;
valore = ;
dic.Add(key, valore);
*/


}
myReader.Close();
cn.Close();
}
catch (Exception e)
{
Console.WriteLine("Exception Occured -->> {0}", e);
}
return dic;
}

Grazie mille

kataklisma Profilo | Senior Member

>Utilizzerò questo metodo per tutte le tabelle del database e
>per tutte le windows form che andro' a realizzare,
>infatti sto cercando di parametrizzare il tutto per ottimizzare
>il codice.
>Un'ultima domanda.
>E' possibile mettere l'istruzione che mi ha suggerito all'interno
>di un ciclo "foreach" oppure "for" o "while"
>per scorrere automaticamente tutti gli headers delle colenne
>e i valori in esse.

In base all'approccio da te utilizzato puoi provare una cosa del genere :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Non l'ho provato, quindi testalo e scrivimi pure se ci sono errori o perplessità

>Grazie
>Grazie mille

;)

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

lexen Profilo | Newbie


C'è qualcosa che non va.
L'istruzione per ricavare il nome delle colonne non va bene.
Mi ritorna i seguenti valori :
ColumnName
ColumnOrdinal
ColumnSize
ecc. ecc.

insomma tutto tranne che gli header.
Grazie

kataklisma Profilo | Senior Member

>C'è qualcosa che non va.
>L'istruzione per ricavare il nome delle colonne non va bene.
>Mi ritorna i seguenti valori :
>ColumnName
>ColumnOrdinal
>ColumnSize
>ecc. ecc.

Ma i valori li acquisisce senza nessun tipo di errore?

Purtroppo non ho il compilatore sottomano ora, ma sono convinto che quest'istruzione dia in output gli headers delle colonne :

myReader.GetSchemaTable().Columns[i].ColumnName

Prova ad effettuare un debug sul ciclo prendi informazioni sui vari oggetti e fammi sapere!

>insomma tutto tranne che gli header.

>Grazie
;)

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

lexen Profilo | Newbie


Niente da fare non funziona.
Possibile che non c'è un modo per prelevare i dati dell'ultimo record inserito e l'intestazione delle colonne del record a runtme.
Grazie

lexen Profilo | Newbie


Niente da fare non funziona.
Possibile che non c'è un modo per prelevare i dati dell'ultimo record inserito e l'intestazione delle colonne del record a runtmein un unico ciclo?
Grazie

kataklisma Profilo | Senior Member

>
>Niente da fare non funziona.
>Possibile che non c'è un modo per prelevare i dati dell'ultimo
>record inserito e l'intestazione delle colonne del record a runtmein
>un unico ciclo?


Utilizza questo codice...
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>Grazie
Di niente ;)

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

lexen Profilo | Newbie

ok grazie adesso sembra funzionare.
Ultima cosa potresti dirmi come ciclare per ricavare i valori.
Ho provato ad assemblarlo con il mio codice e non va bene.

Grazie

kataklisma Profilo | Senior Member

>ok grazie adesso sembra funzionare.
Di niente!! Anzi scusa per il codice postato precedentemente ma non potevo provarlo!


>Ultima cosa potresti dirmi come ciclare per ricavare i valori.
>Ho provato ad assemblarlo con il mio codice e non va bene.
Certo! Ti posto il codice completo :
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Vorrei farti notare che quel ciclo funziona solo con un numero di righe pari ad uno :

Infatti, ds.Tables[0].Rows[0][i].ToString() non significa altro che :

-Prendi la prima riga (Rows[0]) della collection DataRow nella tabella con index 0, in questo caso unica tabella, e cicla gli index di colonna per ottenere i valori relativi (Rows[0][i] = Rows[Riga][Colonna]);


>Grazie
Di niente!
------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5