如何在C#中引用Datatable的列而不是通过标头名称

我已经将一个excel文件的信息传递给一个数据表。 我只能select一部分的列来采取行动。 但是有四个列有相同的标题名称,所以我不能用标题名称来引用它们。

防爆。 数据|名称|客服中心|额外|额外|额外|额外费用。

我不能改变标题名称,因为Excel文件是从程序自动生成的报告。 到现在为其他function,我select这样的列:

DataTable dt = xls.ReadExcel(file); dt = dt.SelectColumns(false, "Date", "Transaction ID", "Service ID", "Service",); 

SelectColumns方法是:

 public static DataTable SelectColumns(this DataTable dt, bool distinct, params string[] filters) { DataView dv = new DataView(dt); DataTable newdt = dv.ToTable(distinct, filters); return newdt; } 

修改您的扩展方法以接受整数并过滤未指定的列。 您必须从“从右到左”迭代集合,因为迭代时它会更改。 这也意味着你应该按照正确的顺序(从左到右,意思是最小的)inputparams ,以确保正确的过滤。 其他方法是在扩展方法中命令params集合。
还要记住,列使用从零开始的索引,所以第一列是0,而不是1。

这与快速testing工作。

 public static DataTable SelectColumns(this DataTable dt, params int[] filters) { for (int i = dt.Columns.Count - 1; i >= 0; i--) { DataColumn c = dt.Columns[i]; if (!filters.Contains(c.Ordinal)) { dt.Columns.Remove(c); } } return dt; }