这是我第一次编写可以调用自身的函数。我试图删除行为空的DataTable
的所有列。
代码工作正常,但吐出一些错误。由于某种原因,它最后一次循环通过for
循环,旧的$Columns
号码仍在内存中。虽然我每次调用这个函数时都会再填充它...但我不明白为什么......
代码:
Function Remove-EmptyColumns {
$Columns = $DataTable.Columns.Count
$Rows = $DataTable.Rows.Count
for ($c = 0; $c -lt $Columns; $c++) {
$Empty = 0
for ($r = 0; $r -lt $Rows; $r++) {
if ($DataTable.Rows[$r].Item($c).ToString() -eq '') {
$Empty++
}
}
if ($Empty -eq $Rows) {
$DataTable.Columns.Remove($DataTable.Columns[$c])
Remove-EmptyColumns
}
}
}
感谢您的帮助。
答案 0 :(得分:1)
为什么它是递归方法?尝试删除Remove-EmptyColumns,它应该可以工作,不是吗?
编辑:尝试
Function Remove-EmptyColumns {
$Columns = $DataTable.Columns.Count
$Rows = $DataTable.Rows.Count
$columnsToRemove = @()
for ($c = 0; $c -lt $Columns; $c++) {
$Empty = 0
for ($r = 0; $r -lt $Rows; $r++) {
if ($DataTable.Rows[$r].Item($c).ToString() -eq '') {
$Empty++
}
}
if ($Empty -eq $Rows) {
$columnsToRemove.Add($DataTable.Columns[$c])
}
}
$columnsToRemove | ForEach-Object {
$DataTable.Columns.Remove($_) }
}
答案 1 :(得分:1)
只是一个想法,但我喜欢使用IsNullOrEmpty的String静态方法。
if ([string]::IsNullOrEmpty($DataTable.Rows[$r].Item($c).ToString()))
{ ... }
这可以消除价值可能不相等的问题''但要改为$ Null,它只能在一行中完成。