将列表转换为数据表

时间:2014-04-01 15:56:14

标签: c# asp.net list datatable

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

这样的数据表
ProcessName  ArrivalTime  CpuTime
P1           0            10
P2           5            20

进程数(行数)是动态的。我试过这样的事情:

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;
    }

3 个答案:

答案 0 :(得分:1)

要以您描述的方式创建数据表,您需要采用不同的方式。

  1. 创建数据表对象
  2. 使用Columns方法
  3. Add()添加到数据表对象
  4. 使用数据表对象NewRow()方法获取与您的数据表具有相同模式的DataRow对象
  5. 使用所需的值填充此DataRow的列
  6. 使用Add()方法将此DataRow添加到数据表对象的Rows集合中
  7. 重复步骤3到6,直到列表结束。

答案 1 :(得分:0)

for循环i的第二次迭代中,您将获得第3行,这样您就可以获得表格的第4行(此时您的表格有2行)。然后,您将获得该行的第4,第5和第6列(您的表格有0列,因为您尚未添加任何列),无法设置其值。相应的索引超出范围错误应该告诉你完全这里有什么错误。

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

答案 2 :(得分:0)

这样的事情应该有效。继续添加到curRow,直到当前迭代以'P'开头。当它以'P'开头时,将currentRow添加到数据表并开始一个新行。

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在添加到数据表之前不为空...这是一种分类。