ArrayList孤立对象

时间:2016-02-01 09:00:34

标签: powershell arraylist

我有一个奇怪的问题,我使用多个for循环并使用基于循环作为索引的对象属性构建的字符串填充arraylist。

我发现如果我Write-Host我将所有这些行添加到arraylist中。屏幕上打印的内容正是我想要在arraylist中看到的,但是当我使用类似的东西遍历数组列表时:

foreach ($r in $Result) {
    Write-Host -ForegroundColor Yellow "Object: $r"
}

我在arraylist中看到了大量我不期待的条目。我不知道为什么。我在这里发布了这个功能:

function Process-Config () {
    param(
        [string]$XMLPath
    )

    #  Validate Parameters
    if (Test-Path $XMLPath) { } else { exit }

    Add-Type -path C:\Users\user\Downloads\ChilkatDotNet2-9.5.0-x64\ChilkatDotNet2-9.5.0-x64\ChilkatDotNet2.dll
    $xml1 = New-Object Chilkat.Xml

    $success = $xml1.LoadXmlFile($XMLPath)
    if ($success -ne $true) {
        $($xml.LastErrorText)
        exit
    }

    $("NumChildren = " + $xml1.NumChildren)
    Write-Host -ForegroundColor yellow "here"
    #  Array list that holds each string so it can be compared later on
    $ResponseStrings = New-Object System.Collections.ArrayList
    #  Iterate over the direct children by index. The first child
    #  is at index 0.

    for ($i = 0; $i -le $xml1.NumChildren - 1; $i++) {
        $output = $("$i : $($xml1.GetChildTagByIndex($i)) : $($xml1.GetChildContentByIndex($i))")
        Write-Host -ForegroundColor yellow "Top Level"
        Write-Host -foregroundcolor green "Adding::::: $output"
        $ResponseStrings.Add($output)

        $xml2 = $xml1.GetChild($i)
        for ($j = 0; $j -le $xml2.NumChildren -1; $j++) {
            if ($xml2.GetChildContentByIndex($j) -eq $null -or $xml2.GetChildContentByIndex($j) -eq ""){
                $xml3 = $xml2.GetChild($j)
                for ($k = 0; $k -le $xml3.numchildren -1; $k++){
                    if ($xml3.GetChildContentByIndex($k) -eq $null -or $xml3.GetChildContentByIndex($k) -eq "") {
                        $xml4 = $xml3.GetChild($k)
                        for ($l = 0; $l -le $xml4.NumChildren -1; $l++) {
                            if ($xml4.GetChildContentByIndex($l) -eq $null -or $xml4.GetChildContentByIndex($l) -eq "") {
                                $xml5 = $xml4.GetChild($l)
                                for ($m = 0; $m -le $xml5.NumChildren -1; $m++){
                                    if ($xml5.GetChildContentByIndex($m) -eq $null -or $xml5.GetChildContentByIndex($m) -eq "") {
                                        $xml6 = $xml5.GetChild($m)
                                        for ($n = 0; $n -le $xml6.NumChildren -1; $n++) {
                                            $Output =  $("$i : $($xml1.GetChildTagByIndex($i))  ::  $($xml2.GetChildTagByIndex($j)) :: $($xml3.GetChildTagByIndex($k)) $($xml4.GetChildTagByIndex($l)) :: $($xml5.GetChildTagByIndex($m)) $($xml5.GetChildTagByIndex($m)) :: $($xml6.GetChildTagByIndex($n)) : $($xml6.GetChildContentByIndex($n)))")
                                            Write-Host -ForegroundColor Green "adding::::: $output"
                                            $ResponseStrings.Add($output)
                                        }
                                    }

                                    $output = $("$i : $($xml1.GetChildTagByIndex($i)) :: $($xml2.GetChildTagByIndex($j)) :: $($xml3.GetChildTagByIndex($k)) $($xml4.GetChildTagByIndex($l)) :: $($xml5.GetChildTagByIndex($m)) : $($xml5.GetChildContentByIndex($m))") 
                                    Write-Host -ForegroundColor Green "adding::::: $output"
                                    $ResponseStrings.Add($output)
                                }
                            }

                            $output = $("$i : $($xml1.GetChildTagByIndex($i)) :: $($xml2.GetChildTagByIndex($j)) :: $($xml3.GetChildTagByIndex($k)) :: $($xml4.GetChildTagByIndex($l)) : $($xml4.GetChildContentByIndex($l))")
                            Write-Host -ForegroundColor Green "adding::::: $output"
                            $ResponseStrings.Add($output)
                        }
                    }

                    $output = $("$i : $($xml1.GetChildTagByIndex($i)) :: $($xml2.GetChildTagByIndex($j)) :: $($xml3.GetChildTagByIndex($k)) : $($xml3.GetChildContentByIndex($k))")
                    Write-Host -ForegroundColor Green "adding::::: $output"
                    $ResponseStrings.Add($output)
                }
            }

            $output = $("$i : $($xml1.GetChildTagByIndex($i)) :: $($xml2.GetChildTagByIndex($j)) : $($xml2.GetChildContentByIndex($j))")
            Write-Host -ForegroundColor Green "adding::::: $output"
            $ResponseStrings.Add($output)
        }
    }

    return $ResponseStrings
}

如果有人可以看看并解释为什么阵列中有如此多的孤立对象,而不是我想添加的对象,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

Add()ArrayList发送内容时,它会发出元素的索引:

PS C:\> $ArrayList = New-Object System.Collections.ArrayList
PS C:\> $ArrayList.Add("something")
0
PS C:\> $ArrayList.Add("somemore")
1

我认为这些整数就是你所说的"孤儿"你的功能的输出。

您可以通过多种方式抑制ArrayList.Add()的输出:

# cast to [void]
[void]$ResponseStrings.Add($output)

# assign to null
$null = $ResponseStrings.Add($output)

# pipe to null
$ResponseStrings.Add($output) | Out-Null 

或者,使用ArrayList以外的其他内容!

使用简单数组:

[array]$ResponseStrings += $output

a generic List

$ResponseStrings = New-Object System.Collections.Generic.List[string]

for ($i = 0; $i -le $xml1.NumChildren - 1; $i++){
    # this is now safe, List<string>.Add() doesn't return anything 
    $ResponseStrings.Add($output)
    # ... and so on
}
相关问题