C # looping attraverso List <dictionary > per compilare un DataTable

Ho bisogno di scorrere un elenco di dizionari

List<Dictionary> 

compilare un DataTable. Ogni dizionario nella lista ha una chiave, che deve essere il nome della colonna, e un valore che è ciò che è in quella colonna. L’elenco contiene 225 dizionari (225 righe per la tabella).

 List<Dictionary> myList = JsonConvert.DeserializeObject<List<Dictionary>>(jsonRep); DataTable dt = new DataTable(); //loop through list, loop through dictionaries, add keys as columns, //values as rows. 

finora, ho provato ..

 //get max columns int columns = myList[0].Count; <--gives me 13 //add columns for (int i = 0; i < columns; i++) dt.Columns.Add(string myList[i].Keys); <--somehow get to the key in dict to add as column names //add rows foreach (var x in myList) { dt.Rows.Add(x); <--not working } jsonReprValue = dt; <--save new DataTable to var jsonReprValue 

Come faccio a farlo correttamente? Grazie!

    Hai due problemi. Uno sta aggiungendo le colonne e l’altro sta aggiungendo le righe.

    Aggiungere le colonne

    Supponendo che l’elenco contenga elementi e che tutti i dizionari dell’elenco abbiano le stesse chiavi, è sufficiente aggiungere colonne da uno dei dizionari:

     foreach(string column in myList[0].Keys) { dt.Columns.Add(column); } 

    Aggiungere le righe

    Cambia questo:

     foreach (var x in myList) { dt.Rows.Add(x); <--not working } 

    A questo:

     foreach(Dictionary dictionary in myList) { DataRow dataRow = dt.NewRow(); foreach(string column in dictionary.Keys) { dataRow[column] = dictionary[column]; } dt.Rows.Add(dataRow); } 

    Vedi DataTable.NewRow .

    Esempio di Reiview DataTable Class su come lavorare con una tabella di dati. Ma ecco un esempio che usa Linq

     List> myList = new List>() { new Dictionary() { { "ABC", "This" }, { "DEF", "is" }, { "GHI", "radio" }, { "JKL", "clash" } } }; DataTable dt = new DataTable(); // Add columns first dt.Columns.AddRange( myList.First () .Select (kvp => new DataColumn() { ColumnName = kvp.Key, DataType = System.Type.GetType("System.String")} ) .AsEnumerable() .ToArray() ); // Now add the rows myList.SelectMany (Dict => Dict.Select (kvp => new { Row = dt.NewRow(), Kvp = kvp })) .ToList() .ForEach( rowItem => { rowItem.Row[rowItem.Kvp.Key] = rowItem.Kvp.Value; dt.Rows.Add( rowItem.Row ); } ); dt.Dump(); 

    Il risultato (Dump è specifico per LinqPad non .Net): inserisci la descrizione dell'immagine qui