如何将列插入两个现有列之间的数据集中?

我正在尝试使用C#将列插入现有的DataSet中。

作为一个例子,我有一个DataSet定义如下:

DataSet ds = new DataSet(); ds.Tables.Add(new DataTable()); ds.Tables[0].Columns.Add("column_1", typeof(string)); ds.Tables[0].Columns.Add("column_2", typeof(int)); ds.Tables[0].Columns.Add("column_4", typeof(string)); 

稍后在我的代码中,我想在第2列和第4列之间插入一列。

DataSet有添加列的方法,但我似乎无法找到插入列的最佳方法。

我想写下面的内容……

 ...Columns.InsertAfter("column_2", "column_3", typeof(string)) 

最终结果应该是具有包含以下列的表的数据集:column_1 column_2 column_3 column_4

而不是:column_1 column_2 column_4 column_3这是add方法给我的

肯定有办法做这样的事情。

编辑 …只是想根据下面的一些评论澄清我正在使用DataSet做什么:

我从存储过程中获取数据集。 然后,我必须向数据集添加其他列,然后将其转换为Excel文档。 我无法控制存储过程返回的数据,所以我必须在事后添加列。

您可以使用DataColumn.SetOrdinal()方法来实现此目的。

 DataSet ds = new DataSet(); ds.Tables.Add(new DataTable()); ds.Tables[0].Columns.Add("column_1", typeof(string)); ds.Tables[0].Columns.Add("column_2", typeof(int)); ds.Tables[0].Columns.Add("column_4", typeof(string)); ds.Tables[0].Columns.Add("column_3", typeof(string)); //set column 3 to be before column 4 ds.Tables[0].Columns[3].SetOrdinal(2); 

我使用你的建议为DataSet的DataColumnCollection创建一个扩展方法:

 public static void InsertAfter(this DataColumnCollection columns, DataColumn currentColumn, DataColumn newColumn) { if (!columns.Contains(currentColumn.ColumnName)) throw new ArgumentException(/** snip **/); columns.Add(newColumn); //add the new column after the current one columns[newColumn.ColumnName].SetOrdinal(currentColumn.Ordinal + 1); } 

我现在可以写:

  dt = ds.Tables[0]; dt.Columns.InsertAfter(dt.Columns["column_2"], new DataColumn("column_3")); 

基于https://stackoverflow.com/a/17372008/492336 ,我使用SetOrdinal和IndexOf()在foo之前插入bar

 table.Columns.Add("bar").SetOrdinal(table.Columns.IndexOf("foo")); 

要在foo之后插入它,只需添加+1

 table.Columns.Add("bar").SetOrdinal(table.Columns.IndexOf("foo")+1); 

将前两列复制到新数据集中,然后添加第三列,并添加其余列。

如有必要,您可以将其包装在InsertAfter函数中。