将列表转换为数据表

本文关键字:数据表 转换 列表 | 更新日期: 2023-09-27 17:56:12

>假设我有一个像PL = { P1, 0, 10, P2, 5, 20 }这样的列表,我需要将其转换为类似

ProcessName  ArrivalTime  CpuTime
P1           0            10
P2           5            20

进程数(行计数)是动态的。我已经尝试过这样的sth:

protected DataTable CreateDataTable()
{
    int j = 0;
    List<string> PL = CreateProcessList();
    DataTable DT = new DataTable();
    for (int i = 0; i < PL.Count - 2; i += 3)
    {
        DataRow ProcessRow = DT.NewRow();
        DT.Rows[j][0] = PL[i].ToString();
        DT.Rows[j][1] = Convert.ToInt32(PL[i + 1]);
        DT.Rows[j][2] = Convert.ToInt32(PL[i + 2]);
        j++;
    }
    DT.Columns.Add("Header", typeof(string));
    DT.Columns[0].ColumnName = "ProcessName";
    DT.Columns[1].ColumnName = "ArrivalTime";
    DT.Columns[2].ColumnName = "CpuTime";
    return DT;
}

它不起作用(表示位置 0 处没有行)。感谢您的任何想法。

版本后的工作代码:

    protected DataTable CreateDataTable()
    {
        List<string> PL = CreateProcessList();
        DataTable DT = new DataTable();
        DT.Columns.Add("ProcessName", typeof(string));
        DT.Columns.Add("ArrivalTime", typeof(int));
        DT.Columns.Add("CpuTime", typeof(int));
        for (int i = 0; i < PL.Count - 2; i += 3)
        {
            DataRow ProcessRow = DT.NewRow();
            ProcessRow[0] = PL[i].ToString();
            ProcessRow[1] = Convert.ToInt32(PL[i + 1]);
            ProcessRow[2] = Convert.ToInt32(PL[i + 2]);
            DT.Rows.Add(ProcessRow);
        }
        return DT;
    }

将列表转换为数据表

要按照您描述的方式创建数据表,您需要遵循不同的方式。

  1. 创建数据表对象
  2. 使用 Add() 方法向数据表对象添加列
  3. 使用 Datatable 对象 NewRow() 方法获取与数据表具有相同架构的 DataRow 对象
  4. 使用所需的值填充此数据行的列
  5. 使用 Add() 方法将此数据行添加到数据表对象的行集合中
  6. 重复步骤 3 到 6,直到列表到达末尾。

for循环的第二次迭代中,i是3,所以你得到的是表的第4行(此时你的表有2行)。 然后,您将获得该行的第 4、5 和 6 列(您的表有 0 列,因为您尚未添加任何列)来设置其值。 相应的索引超出范围错误应该准确地告诉您这里出了什么问题。

不要访问表中的第 i 行。 只需使用 ProcessRow 即可访问该行;它就在变量中。 不要访问第 i 列,访问第 1 列、第 2 列和第 3 列(并在尝试填充列之前添加列。

这样的东西应该可以工作。继续添加到curRow,直到当前迭代以"P"开头。当它以"P"开头时,将当前行添加到数据表中并开始一个新行。

DataTable dataTable;
DataRow curRow;
... add columns to dataTable
for (var i = 0; i < PL.Count; i++) {
    if (PL[i].ToString().StartsWith("P")) {
        if (curRow != null)
            dataTable.Rows.Add(curRow);
        curRow = dataTable.NewRow();
    }
    ... add PL[i] to curRow
}

这有一些小问题,但它们可以很容易地修复。在添加到数据表之前确保curRow不为空的检查...那种东西。