C# 将列表转换为数据表

C# 将列表转换为数据表,c#,asp.net,list,datatable,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 = Create

假设我有一个类似于
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;
}
受保护的数据表CreateDataTable()
{
int j=0;
List PL=CreateProcessList();
DataTable DT=新的DataTable();
对于(int i=0;i
它不起作用(表示位置0处没有行)。谢谢你的建议

版本后的工作代码:
受保护的数据表CreateDataTable()
{
List PL=CreateProcessList();
DataTable DT=新的DataTable();
Add(“ProcessName”,typeof(string));
添加(“到达时间”,类型(int));
添加(“CpuTime”,typeof(int));
对于(int i=0;i
在第二次迭代中,您的
for
循环
i
是3,因此您将得到表的第4行(此时您的表有2行)。然后,您将获得该行的第4、第5和第6列(您的表有0列,因为您尚未添加任何列)以设置其值。相应的索引超出范围错误应该告诉您这里到底出了什么问题


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

类似的操作应该有效。继续添加到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
}
DataTable;
数据行电流;
…向dataTable添加列
对于(变量i=0;i

这其中有一些小问题,但可以很容易地解决。在添加到数据表之前,请检查以确保curRow不为null……诸如此类的事情。

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

  • 创建datatable对象
  • 使用以下方法添加到datatable对象
  • 使用datatable对象方法获取与datatable具有相同架构的对象
  • 用所需的值填充此数据行的列
  • 使用以下方法将此DataRow添加到datatable对象的Rows集合中
  • 重复步骤3至6,直到列表结束

  • 感谢回复,我如上所述编辑了我的代码。仍然是“位置0处没有行”。@samet然后您没有按照我描述的所有方式编辑代码,即您仍然试图通过其索引访问行。感谢这另一个精确的解决方案!
    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
    }