PDA

View Full Version : [C#][LINQ] Creare un Dictionary da un DataTable


robertino_salemi
31-07-2015, 00:42
Sera a tutti,
ho un datatable formato da N colonne, due delle quali sono 'tipo' e 'colore'.

Avrei la necessità di popolare un Dictionary eseguendo un distinct sul dataTable per 'tipo' e tirando fuori i colori ad esso associati.

Ho semplicemente scritto:

Dictionary<String, String> listOfTypeColours = new Dictionary<String, String>();

listOfTypeColours = fs.DataTable.AsEnumerable().Distinct()
.ToDictionary(
row => row.Field<String>('Tipo'),
row => row.Field<String>('Colore')
);

ma non riesco ad eseguire la distinct per 'tipo'.

Potreste aiutarmi?

Grazie

robertino_salemi
31-07-2015, 09:54
Oppure potrei prima eseguire un distinct per ricavare i 'tipi' presenti....ma dopo come posso eseguire un iterator per ricavare il 'colore' corrispondente?


List<string> arrType = fs.DataTable.AsEnumerable()
.Select(row => row.Field<String>('Tipo'))
.Distinct()
.ToList();


Grazie.

robertino_salemi
31-07-2015, 10:20
Ragazzi, ho trovato questa soluzione funzionante:

Dictionary<String, String> listOfTypeColours = new Dictionary<String, String>();

List<string> arrType = fs.DataTable.AsEnumerable().Select(row => row.Field<String>('TIPO')).Distinct().ToList();

foreach (string item in arrType)
{
string myKey = fs.DataTable.AsEnumerable().Where(row => row.Field<String>('TIPO').Equals(item))
.Select(row => row.Field<String>('COLORE')).First();

listOfTypeColours.Add(item, myKey);
}
.

Se comunque esiste un modo per eseguire un distinct sul DataTable e da esso ricavare un Dictionary, potreste indicarmelo?

Grazie.

lishi
31-07-2015, 19:52
A dire la verità mi sembra che la tua soluzione non sia corretta
se hai

"Pippo", "ROSSO"
"Pippo","Verde"

A pippo verrebbe associato solo il primo perdendo il secondo

Ti serve forse

Dictionary<string,List<string>> typeToColors;


Che puoi fare tipo

Dictionary<string,List<string>> dict = dt.AsEnumerable().GroupBy(r => r.Field<string>("tipo")).ToDictionary(r => r.Key, r => r.AsEnumerable().Select(ri => ri.Field<string>("colore")).ToList());

robertino_salemi
03-08-2015, 01:00
Ho dimenticato di dire che l'associazione è unica...ho in join due tabelle da una delle quali si ricava il colore per ogni tipo....