loops - 为什么我不能将哈希表存储在数组列表中?

标签 loops powershell arraylist hashtable

这是我的代码

$allTests = New-Object System.Collections.ArrayList
$singleTest = @{}

$singleTest.add("Type", "Human")

1..10 | foreach {

    $singleTest.add("Count", $_)
    $singleTest.add("Name", "FooBar...whatever..$_")
    $singleTest.add("Age", $_)
    $allTests.Add($singleTest) | out-null

    $singleTest.remove("Count")
    $singleTest.remove("Name")
    $singleTest.remove("Age")
}

根据我的理解,我的循环应该在每次到达时将哈希表的副本添加到数组列表

$allTests.Add($singleTest) | out-null

循环继续,删除一些键,这为循环的下一次迭代铺平了道路。事实并非如此,就像 add 命令只是添加对哈希表的引用。

如果我检查

的最终值
$allTests

这会被返回

Name                           Value                                                                                                                   
----                           -----                                                                                                                   
Type                           Human                                                                                                                   
Type                           Human                                                                                                                   
Type                           Human                                                                                                                   
Type                           Human                                                                                                                   
Type                           Human                                                                                                                   
Type                           Human                                                                                                                   
Type                           Human                                                                                                                   
Type                           Human                                                                                                                   
Type                           Human                                                                                                                   
Type                           Human     

如何解决此问题,以便将哈希表的实际副本存储在数组列表中?

我正在寻找类似的输出

$allTests[0]

Name                           Value                                                                                                                   
----                           -----                                                                                                                   
Count                          1                                                                                                                       
Name                           FooBar...whatever..1                                                                                                    
Age                            1                                                                                                                       
Type                           Human  

$allTests[1]   

Name                           Value                                                                                                                   
----                           -----                                                                                                                   
Count                          2                                                                                                                       
Name                           FooBar...whatever..2                                                                                                    
Age                            2                                                                                                                       
Type                           Human  

最佳答案

哈希表是引用,当您创建一个对象时,所有进一步的操作都针对该哈希表,包括尝试检索该信息。

您可以在每次循环运行时声明一个新的哈希表来解决这个问题。

$allTests = New-Object System.Collections.ArrayList

1..10 | foreach {
    $singleTest = @{}
    $singleTest.add("Type", "Human")
    $singleTest.add("Count", $_)
    $singleTest.add("Name", "FooBar...whatever..$_")
    $singleTest.add("Age", $_)
    $allTests.Add($singleTest) | Out-Null
}

甚至可以这样来消除一些臃肿。

$allTests = New-Object System.Collections.ArrayList
1..10 | foreach {
    $allTests.Add(@{
        Type = "Human"
        Count = $_
        Name = "FooBar...Whatever..$_"
        Age = $_
    }) | Out-Null
}

这两个答案都会为您提供预期的输出。

关于loops - 为什么我不能将哈希表存储在数组列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45242067/

相关文章:

javascript - 在javascript中循环代码n次,n由用户输入决定?

r - 如何在 R 中的 reshape 包中循环 dcast 函数

powershell - 如何在powershell函数中获取当前正在执行的文件

c# - 如何使用参数在 c# 中调用 powershell 脚本

java - 将 arrayList 与自身进行比较

java - TreeMap——如何查找以字母表中每个字母开头的单词数

r - 如何创建循环和/或函数以将 200 列(并创建 200 个新列/变量)除以另一列以获得百分比?

azure - 您能否找到将计算机加入 Azure AD 的帐户名称?

java - 从 ArrayList HashMap<String, String> 中的键/值中检索值

java - 如何获取两个ArrayList的重复值?