C# 无法删除C中datatable中的空列名#
我有一个Excel,业务用户将更新并发送给我们。Blue Prism robot将使用code stage拾取文件并上传到SQL数据库表中(使用code stage要快得多)。我已经编写了C#代码来实现这一点,但是大多数情况下由于列中的空白而失败 当代码使用usedrange时,它也会占用空白,并创建列名为F16、F17的数据表。。。(当列计数为15时) 我想动态地处理这个问题。i、 e无论列计数和空白列计数如何,代码都应该通过从数据表中删除这些空白列来工作 我已经写了一些代码来处理这个问题,但是没有成功。它抛出一个错误: 收集被修改;枚举操作可能无法执行[重复] 在上述代码中,似乎无法使用remove命令删除数据表中的任何列 如果有人能在这件事上帮助我,那将是很大的帮助 注意:我试着使用fornext循环像下面一样向后重复它,但仍然面临一个问题C# 无法删除C中datatable中的空列名#,c#,datatable,ado.net,oledbcommand,C#,Datatable,Ado.net,Oledbcommand,我有一个Excel,业务用户将更新并发送给我们。Blue Prism robot将使用code stage拾取文件并上传到SQL数据库表中(使用code stage要快得多)。我已经编写了C#代码来实现这一点,但是大多数情况下由于列中的空白而失败 当代码使用usedrange时,它也会占用空白,并创建列名为F16、F17的数据表。。。(当列计数为15时) 我想动态地处理这个问题。i、 e无论列计数和空白列计数如何,代码都应该通过从数据表中删除这些空白列来工作 我已经写了一些代码来处理这个问题,但
for (int z = dtTable.Columns.Count - 1; z>=0;z--)
{
if (dtTable.Columns[z].ColumnName.ToString()=="F" + (z).ToString())
dtTable.Columns.Remove(dtTable.Columns[z].ColumnName.ToString());
}
dtTable.AcceptChanges();
根据以下JohnPete22给出的评论,其工作性能良好
如果您仔细想想,您正在循环遍历每个数据列,然后同时从该集合中删除,这是不可能发生的。您需要一个For循环,然后向后循环到0(您可以看到在该行的正上方发生)。一般的经验法则:如果你同时循环浏览一个集合,那么将其删除不是一个好主意,除非你是逆向操作 还应注意以下几点 我以前尝试过使用John的解决方案,但没有成功。然后我意识到我已经使用了if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z).ToString()),但是它应该是if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z+1)
根据以下JohnPete22给出的评论,其工作性能良好
如果您仔细想想,您正在循环遍历每个数据列,然后同时从该集合中删除,这是不可能发生的。您需要一个For循环,然后向后循环到0(您可以看到在该行的正上方发生)。一般的经验法则:如果你同时循环浏览一个集合,那么将其删除不是一个好主意,除非你是逆向操作 还应注意以下几点 我以前尝试过使用John的解决方案,但没有成功。然后我意识到我已经使用了if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z).ToString()),但是它应该是if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z+1)
如果您仔细想想,您正在循环遍历每个数据列,然后同时从该集合中删除,这是不可能发生的。您需要一个For循环,然后向后循环到0(您可以看到在该行的正上方发生)。一般经验法则:如果您同时循环使用一个集合,则从该集合中删除该集合不是一个好主意,除非您反向操作。如果您正在查找列,则没有理由循环使用数据行。您也不必遍历DataColumns,因为您只需要查看列是否存在,如果存在,则删除该列。不需要循环。@我可以修剪空行和空列。行可以正常工作,但列不能正常工作。@JohnPete22感谢您的宝贵输入。我之前试过用这个,但没用。现在我明白了为什么我使用if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z).ToString())但是它应该是if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z+1).ToString()),因为额外的空白名称使用了列的索引1而不是0。请将您的评论作为答案发布,我可以将此标记为resolvedGlad,您已经解决了它。另一个挑剔之处:我建议使用string.compare而不是==<代码>整数z=1;如果(string.Compare(“ColumnName”、string.Format(“F{0}”、z+1)、StringComparison.InvariantCulture)==0){//code to execute}仔细想想,您将循环遍历每个数据列,然后同时从该集合中删除,这是不可能发生的。您需要一个For循环,然后向后循环到0(您可以看到在该行的正上方发生)。一般经验法则:如果您同时循环使用一个集合,则从该集合中删除该集合不是一个好主意,除非您反向操作。如果您正在查找列,则没有理由循环使用数据行。您也不必遍历DataColumns,因为您只需要查看列是否存在,如果存在,则删除该列。不需要循环。@我可以修剪空行和空列。行可以正常工作,但列不能正常工作。@JohnPete22感谢您的宝贵输入。我之前试过用这个,但没用。现在我明白了为什么我使用if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z).ToString())但是它应该是if(dtTable.Columns[z].ColumnName.ToString()==“F”+(z+1).ToString()),因为额外的空白名称使用了列的索引1而不是0。请将您的评论作为答案发布,我可以将此标记为resolvedGlad,您已经解决了它。另一个挑剔之处:我建议使用string.compare而不是==<代码>整数z=1;if(string.Compare(“ColumnName”、string.Format(“F{0}”、z+1)、StringComparison.InvariantCulture)==0){//code to execute}
for (int z = dtTable.Columns.Count - 1; z>=0;z--)
{
if (dtTable.Columns[z].ColumnName.ToString()=="F" + (z).ToString())
dtTable.Columns.Remove(dtTable.Columns[z].ColumnName.ToString());
}
dtTable.AcceptChanges();