假设我有一个像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;
}
答案 0 :(得分:1)
要以您描述的方式创建数据表,您需要采用不同的方式。
答案 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在添加到数据表之前不为空...这是一种分类。