0

这是我一直试图克服的一些奇怪的例子,最终结果是我想要一个带有组合哈希表的新变量,但不修改两个原始哈希表。

示例:我有两个哈希表。

    $User = @{
        "Name" = "Jane Doe"
        "Location" = "Work"
        }
    $Details = @{
        "hair" = "Brown"
        "Eyes" = "Blue"
        "Height" = "68"
        }

我想将一个添加到另一个,并将结果复制到一个新变量。几个例子:

    $newHash = $User.add("Details",$Details)

    ($newHash = $User).add("Details",$Details)

    $newHash = $User
    $newHash.add("Details",$Details)

最后两个用于添加详细信息,但它们将其添加到 $newHash 和 $User!如果您运行第三个示例,然后删除详细信息:

   $User.Remove("Details")

它从 $User 和 $newHash 中删除它!我似乎无法解决这种行为,非常感谢您的建议!

4

3 回答 3

4

尝试这个:

$User = @{
          "Name" = "Jane Doe"
          "Location" = "Work"
    }
$Details = @{
             "hair" = "Brown"
             "Eyes" = "Blue"
             "Height" = "68"
            }

$newHash = $User.clone()
$newHash.Add('Details',$details)
于 2013-11-01T17:17:29.460 回答
2

我认为重要的是要指出这不是奇怪的行为,而是设计使然。当你说

$newHash = $User

您正在制作 $User 的浅拷贝,现在 $newHash 和 $User 都指向同一个内存空间。换句话说,$newHash 现在只是一个指向与 $User 相同数据的指针。这就是为什么当您更新一个时,另一个也会更新。Mjolinor 通过克隆 $User 而不是简单地指向它,以正确的方式做到了这一点。

看这里:

深拷贝和浅拷贝有什么区别?

于 2013-11-01T18:08:59.210 回答
1

.Clone() 是一条正确的路径,但它有点危险,因为在键的区分大小写方面,克隆的哈希表实际上并没有做与常规哈希表完全相同的事情。克隆的哈希表将复制数据,但不会复制 PowerShell 哈希表默认情况下用于使键不区分大小写的一点点信息。

幸运的是,您可以在 PowerShell 中将两个哈希表一起添加,这为您提供了一个非常简单的解决方法:

$NewHash = @{} + $User
于 2013-11-02T20:53:43.270 回答