powershell - 创建对哈希表元素的引用

标签 powershell reference hashtable

因此,我正在尝试创建一个可用于数据导航的树型变量。我在 PowerShell 中尝试在哈希表上使用引用变量时遇到问题。考虑以下代码:

$Tree = @{ TextValue = "main"; Children = @() }
$Item = @{ TextValue = "sub"; Children = @() }
$Pointer = [ref] $Tree.Children
$Pointer.Value += $Item
$Tree

检查引用变量时 $Pointer ,它显示了适当的值,但主要变量 $Tree不受影响。有没有办法在 PowerShell 中创建对哈希表元素的引用,我必须切换到二维数组?

编辑更多信息:

我已经接受了 Mathias 的回答,因为使用 List看起来正是我需要的,但需要更清楚地了解数组和引用如何交互。试试这个代码:
$Tree1 = @()
$Pointer = $Tree1
$Pointer += 1
Write-Host "tree1 is " $Tree1
$Tree2 = @()
$Pointer = [ref] $Tree2
$Pointer.Value += 1
Write-Host "tree2 is " $Tree2

从输出中可以看出,可以获取对数组的引用,然后通过该引用修改数组的大小。我认为如果数组是另一个数组或哈希表的元素,它也会起作用,但事实并非如此。 PowerShell 似乎以不同的方式处理这些。

最佳答案

我怀疑这是这种方式的不幸副作用 +=适用于数组。

当您使用 +=在固定大小的数组上,PowerShell 用新的(更大的)数组替换原始数组。我们可以验证$Pointer.Value不再使用 GetHashCode() 引用相同的数组:

PS C:\> $Tree = @{ Children = @() }
PS C:\> $Pointer = [ref]$Tree.Children
PS C:\> $Tree.Children.GetHashCode() -eq $Pointer.Value.GetHashCode()
True
PS C:\> $Pointer.Value += "Anything"
PS C:\> $Tree.Children.GetHashCode() -eq $Pointer.Value.GetHashCode()
False

解决这个问题的一种方法是避免使用 @()+= .

您可以使用 List输入:
$Tree = @{ TextValue = "main"; Children = New-Object System.Collections.Generic.List[psobject] }
$Item = @{ TextValue = "sub"; Children = New-Object System.Collections.Generic.List[psobject] }
$Pointer = [ref] $Tree.Children
$Pointer.Value.Add($Item)
$Tree

关于powershell - 创建对哈希表元素的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50125273/

相关文章:

regex - 删除数组中除正则表达式模式以外的所有字符

powershell - Redis 服务器不能运行超过 1024M 的 maxheap

java - Java Web 应用程序中可能存在内存泄漏 - 对垃圾收集和 session 属性有疑问

java - 使用哈希表代替数据库系统

haskell - 是否存在有用的 Haskell HashMap/HashTable/Dictionary 库?

powershell - 错误 : Description = Invalid query

java - 在 Eclipse 中添加对库的引用

C++ 通过常量引用传递结构

algorithm - 这个排序算法的名称是什么?

string - 从字符串中删除前导数字