4

辞書のリストをループする必要があります

List<Dictionary<string,string>> 

DataTableにデータを入力します。リスト内の各ディクショナリには、列名である必要があるキーと、その列にある値である値があります。リストには225個の辞書が含まれています(テーブルに対して225行)。

List<Dictionary<string, string>> myList = 
       JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(jsonRep);
DataTable dt = new DataTable();

    //loop through list, loop through dictionaries, add keys as columns, 
    //values as rows.                     

これまで、私は試してきました。

//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

これを正しく行うにはどうすればよいですか?ありがとう!

4

2 に答える 2

8

2 つの問題があります。1 つは列の追加で、もう 1 つは行の追加です。

列の追加

リストにアイテムがあり、リスト内のすべての辞書が同じキーを持っていると仮定すると、辞書の 1 つから列を追加するだけで済みます。

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

行の追加

これを変える:

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

これに:

foreach(Dictionary<string, string> dictionary in myList)
{
    DataRow dataRow = dt.NewRow();

    foreach(string column in dictionary.Keys)
    {
        dataRow[column] = dictionary[column];
    }

    dt.Rows.Add(dataRow);
}

DataTable.NewRowを参照してください。

于 2012-06-13T14:52:03.613 に答える
0

データ テーブルの操作方法に関するDataTableクラスの例を確認します。しかし、これはLinqを使用した例です

List<Dictionary<string, string>> myList = new List<Dictionary<string, string>>()
                                                       { new Dictionary<string,string>() { { "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();

結果(ダンプは.NetではなくLinqPad固有です): ここに画像の説明を入力

于 2012-06-13T15:32:26.783 に答える