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

How to add rows and columns into datatable in single loop?

我有 Json 存储在数据库中,我在 Newtonsoft.Json 的帮助下反序列化到 DataTable 中,像这样

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

这给了我这样的结果图像中的其他列未显示

这里我的 label 是列,value 是列值。这两列都将移至新的 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);

之后我有

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

提前致谢

我想我在这里遗漏了一些东西。这看起来像一个转置函数,我想不出一种方法可以在没有两个循环或在您读入数据时转置数据的情况下完成此操作。但是从发布的内容来看,列 label 包含新的 DataTable的列名。第一列是这个新 DataTable.

的第一行数据

如果是这种情况,那么当您遍历行以从第 1 列(标签)获取列名时,您还可以从第 0 列(值)获取“值”并将此值放入List<string> 名为 valuesList 下面。

然后在循环遍历所有行并在新的 DataTable dtResults 中设置列​​之后,您可以通过将列表设置为 a 从 valuesList 添加一行如下所示的字符串数组。这将生成您在一个循环中显示的第二张图片。我再次猜测它不仅仅是这个简单的转置。由于 DataTable 没有内置的转置函数,您必须自己编写。虽然不确定如何在一个循环中执行此操作。希望这有帮助。

private DataTable Transpose2ColDT(DataTable dtSource) {
  string prefix = "DIAP_";
  string colName = "";
  DataTable dtResult = new DataTable();
  List<string> valuesList = new List<String>();
  if (dtSource.Rows.Count > 0) {
    foreach (DataRow dr in dtSource.Rows) {
      if (!dr.IsNull("Label")) {
        if (dr.ItemArray[1].ToString() != "" ) {
          colName = prefix + "_" + dr.ItemArray[1].ToString();
          if (!dtResult.Columns.Contains(colName)) {
            dtResult.Columns.Add(colName, typeof(string));
            valuesList.Add(dr.ItemArray[0].ToString());
          }
        }
      }
    }
    dtResult.Rows.Add(valuesList.ToArray<string>());
  } // no rows in the original source
  return dtResult;
}