Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中,如何按范围而不是按标题名称引用Datatable的列_C#_Excel_Datatable_Range - Fatal编程技术网

C# 在C中,如何按范围而不是按标题名称引用Datatable的列

C# 在C中,如何按范围而不是按标题名称引用Datatable的列,c#,excel,datatable,range,C#,Excel,Datatable,Range,我已将excel文件的信息传递到数据表中。 我只需要选择一部分列来执行操作。但是其中四列的标题名称相同,因此我无法通过标题名称来引用它们 例如:数据|名称|服务|额外|额外|额外|额外 我无法更改标题名称,因为excel文件是由程序自动生成的报告。到目前为止,对于其他函数,我选择如下列: DataTable dt = xls.ReadExcel(file); dt = dt.SelectColumns(false, "Date", "Transaction ID", "Service ID",

我已将excel文件的信息传递到数据表中。 我只需要选择一部分列来执行操作。但是其中四列的标题名称相同,因此我无法通过标题名称来引用它们

例如:数据|名称|服务|额外|额外|额外|额外

我无法更改标题名称,因为excel文件是由程序自动生成的报告。到目前为止,对于其他函数,我选择如下列:

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;
        }

修改扩展方法以接受整数并过滤掉未指定的列。您必须从右向左迭代集合,因为它在迭代时会发生变化。这也意味着您应该按照从左到右的正确顺序输入参数,这意味着要确保正确过滤,必须先输入最小的参数。另一种方法是在扩展方法中对params集合进行排序。 还要记住,这些列使用从零开始的索引,因此第一列是0,而不是1

这在快速测试中有效

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;
}