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

Posted

技术标签:

【中文标题】如何将一列插入到两个现有列之间的数据集中?【英文标题】:How does one insert a column into a dataset between two existing columns? 【发布时间】:2010-09-25 23:29:09 【问题描述】:

我正在尝试使用 C# 在现有数据集中插入一列。

作为一个例子,我有一个如下定义的数据集:

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 方法给我的

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

编辑...只是想根据下面的一些 cmets 澄清我对 DataSet 所做的事情:

我正在从存储的 程序。然后我必须添加 数据集的附加列 然后将其转换为 Excel 文档。我无法控制 存储过程返回的数据 所以我必须在之后添加列 事实。

【问题讨论】:

只是出于好奇,为什么要这样做?数据库代码依赖于存储列的顺序通常不是一个好主意。 我正在从存储过程中获取数据集。然后我必须向数据集添加额外的列,然后将其转换为 Excel 文档。我无法控制存储过程返回的数据,所以我必须在事后添加列。 我去过那里。有时你只需要写一个 hack。通常是因为你的老板要求这样做。 【参考方案1】:

您可以为此目的使用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);

【讨论】:

【参考方案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"));

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于如何将一列插入到两个现有列之间的数据集中?的主要内容,如果未能解决你的问题,请参考以下文章

将一列添加到功能集

将一张表数据定时插入到另一张表

excel中怎么将一列中的第一行和最后一行互换,第二行和倒数第二行互换,依次类推

如何将一列添加到由其他列的最小值组成的数据框中?

将一列从一个数据集中添加到另一个

如何利用EXCEL VBA将一列数据中不重复的数据读取到数组中?