将列表转换为数据表
本文关键字:数据表 转换 列表 | 更新日期: 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;
}
要按照您描述的方式创建数据表,您需要遵循不同的方式。
- 创建数据表对象
- 使用 Add() 方法向数据表对象添加列
- 使用 Datatable 对象 NewRow() 方法获取与数据表具有相同架构的 DataRow 对象
- 使用所需的值填充此数据行的列
- 使用 Add() 方法将此数据行添加到数据表对象的行集合中
- 重复步骤 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不为空的检查...那种东西。