如何在单循环中将行和列添加到数据表中?

时间:2017-03-09 10:03:23

标签: c# json datatable dataset datarow

我将Json存储在DataBase中,我在 Newtonsoft.Json 的帮助下将其反序列化为DataTable

string jsonString = "[myJsonfromDB....]";
//Deserialize to DataTable
DataTable dtSerialized = (DataTable)JsonConvert.DeserializeObject(jsonString, (typeof(DataTable)));

这给我的结果如此 图片中的其他列未显示

enter image description here

此处我的标签是列,是列值。这两个列都将被移动到新的DataTable,我将进一步处理我的操作。现在我的问题是我想在一个循环中进行,而我在多个循环中进行,即首先添加列(在第一个循环中)然后添加列值(在第二个循环中)。目前我正在这样做

string colName = string.Empty;
// First Loop to add columns
foreach (DataRow dr in dtSerialized.Rows)
{
   if (!string.IsNullOrEmpty(Utility.Instance.ToString(dr["label"])))
   {
      colName = prefix + "_" + Utility.Instance.ToString(dr["label"]).Replace(" ", string.Empty).Replace("/", "_").Replace("-", "_");
      if (!dtResult.Columns.Contains(colName))
      dtResult.Columns.Add(colName, typeof(string));
   }
}

DataRow drSelect = dtResult.NewRow();
//Second loop to add column values
foreach (DataRow dr in dtSerialized.Rows)
{
   if (!string.IsNullOrEmpty(Utility.Instance.ToString(dr["label"])))
   {
      colName = prefix + "_" + Utility.Instance.ToString(dr["label"]).Replace(" ", "").Replace("/", "_").Replace("-", "_");
      drSelect[colName] = dr["value"];
   }
}

dtResult.Rows.Add(drSelect);
dsResult.Tables.Add(dtResult);

此后我有

enter image description here

我所知道的是,第一个DataRow模式是从DataTable构建的,然后可以添加值,这在上面的代码中很清楚。现在,如何在一个循环中完成?或者我应该搜索我不知道如何执行此操作的替代方法。

提前致谢

1 个答案:

答案 0 :(得分:1)

我猜这里错过了一些东西。这看起来像一个转置函数,我想不出一种方法可以在没有两个循环的情况下实现这一点,或者在读取数据时转置数据。但是从发布的内容开始,label列显示新的{{1}列名称。第一列是此新DataTable的第一行数据。

如果是这种情况,那么当您循环遍历行以从第1列(标签)获取列名时,您还可以从第0列(值)获取“值”并将此值放在{{ 1}}下面命名为DataTable

然后,在遍历所有行并在新List<string> valuesList中设置列之后,您可以通过将列表设置为字符串数组从DataTable添加一行如下。这将生成您在一个循环中显示的第二张图片。我再次猜测它还有比这个简单的转置更多的东西。由于dtResults没有内置的转置功能,您必须自己编写。不知道如何在一个循环中执行此操作。希望这会有所帮助。

valuesList