无法过滤 Switch 内的嵌套哈希表
Trouble filtering a Nested Hashtable inside a Switch
我构建了一个带有 2 个组合框的 WPF 表单,它们都填充了来自此 的查询。
cboAgencies
在脚本运行和表单加载时填充。 cboOffices
基于在 cboAgencies
中所做的选择,并列出特定于所选机构的办公地点。
或者,它应该是。
相关代码如下:
$cboAgencies.Add_SelectionChanged({
$Script:selectedAgency = $cboAgencies.SelectedItem.ToString()
$Script:cboOffices.Items.Clear()
$Script:selectedAdmin = $null
Switch($Script:selectedAgency) {
subdivision1 {
$Script:selectedAdmin = 'division2'
$Script:arr_Offices = ($Script:hash_AgencyOffices[$Script:selectedAdmin][$Script:selectedAgency].Keys | Sort-Object)
$Script:arr_Offices | ForEach-Object {
$Script:cboOffices.Items.Add($_) | Out-Null
}
break
}
subdivision2 {
$Script:selectedAdmin = 'division2'
$Script:arr_Offices = ($Script:hash_AgencyOffices[$Script:selectedAdmin][$Script:selectedAgency].Keys | Sort-Object)
$Script:arr_Offices | ForEach-Object {
$Script:cboOffices.Items.Add($_) | Out-Null
}
break
}
division1 {
$Script:selectedAdmin = 'division1'
$Script:arr_Offices = ($Script:hash_AgencyOffices[$Script:selectedAdmin][$Script:selectedAgency].Keys | Sort-Object)
$Script:arr_Offices | ForEach-Object {
$Script:cboOffices.Items.Add($_) | Out-Null
}
break
}
}
})
注意:代码是匿名的。哈希表中的实际分区或细分名称中没有空格。以防万一这是一个问题。
运行这段代码使用. .\script.ps1
我查询了各个变量,发现以下变量都是正确的:
$cboAgencies.SelectedItem
(和$Script:cboAgencies.SelectedItem
)
$selectedAgency
(和$Script:selectedAgency
)
$selectedAdmin
(和$Script:selectedAdmin
)
但是$arr_Offices是空的,说明问题出在这一行:
$Script:arr_Offices = ($Script:hash_AgencyOffices[$Script:selectedAdmin][$Script:selectedAgency].Keys | Sort-Object)
我通过将它放在 Switch
函数之外进一步证实了这一点:
$Script:arr_Offices = ($Script:hash_AgencyOffices['division2']['subdivision1'] | Sort-Object)
$Script:arr_Offices | ForEach-Object {
$Script:cboOffices.Items.Add($_) | Out-Null
}
还有$arr_Offices
和$cboOffices
填就好了
我做错了什么?
根据您的链接问题,$script:hash_AgencyOffices[$Script:selectedAdmin][$Script:selectedAgency]
生成一个字符串数组,它不会有 .Keys
属性.
你的数据结构是“有键的根哈希表,它们的值是有键的哈希表,它们的值是直接有内容的数组”。
因此您可以使用 AgencyOffices['division2'].Keys
和 AgencyOffices['division2']['subdivision1']
,但不能使用 AgencyOffices['division2']['subdivision1'].Keys
。
我构建了一个带有 2 个组合框的 WPF 表单,它们都填充了来自此
cboAgencies
在脚本运行和表单加载时填充。 cboOffices
基于在 cboAgencies
中所做的选择,并列出特定于所选机构的办公地点。
或者,它应该是。
相关代码如下:
$cboAgencies.Add_SelectionChanged({
$Script:selectedAgency = $cboAgencies.SelectedItem.ToString()
$Script:cboOffices.Items.Clear()
$Script:selectedAdmin = $null
Switch($Script:selectedAgency) {
subdivision1 {
$Script:selectedAdmin = 'division2'
$Script:arr_Offices = ($Script:hash_AgencyOffices[$Script:selectedAdmin][$Script:selectedAgency].Keys | Sort-Object)
$Script:arr_Offices | ForEach-Object {
$Script:cboOffices.Items.Add($_) | Out-Null
}
break
}
subdivision2 {
$Script:selectedAdmin = 'division2'
$Script:arr_Offices = ($Script:hash_AgencyOffices[$Script:selectedAdmin][$Script:selectedAgency].Keys | Sort-Object)
$Script:arr_Offices | ForEach-Object {
$Script:cboOffices.Items.Add($_) | Out-Null
}
break
}
division1 {
$Script:selectedAdmin = 'division1'
$Script:arr_Offices = ($Script:hash_AgencyOffices[$Script:selectedAdmin][$Script:selectedAgency].Keys | Sort-Object)
$Script:arr_Offices | ForEach-Object {
$Script:cboOffices.Items.Add($_) | Out-Null
}
break
}
}
})
注意:代码是匿名的。哈希表中的实际分区或细分名称中没有空格。以防万一这是一个问题。
运行这段代码使用. .\script.ps1
我查询了各个变量,发现以下变量都是正确的:
$cboAgencies.SelectedItem
(和$Script:cboAgencies.SelectedItem
)$selectedAgency
(和$Script:selectedAgency
)$selectedAdmin
(和$Script:selectedAdmin
)
但是$arr_Offices是空的,说明问题出在这一行:
$Script:arr_Offices = ($Script:hash_AgencyOffices[$Script:selectedAdmin][$Script:selectedAgency].Keys | Sort-Object)
我通过将它放在 Switch
函数之外进一步证实了这一点:
$Script:arr_Offices = ($Script:hash_AgencyOffices['division2']['subdivision1'] | Sort-Object)
$Script:arr_Offices | ForEach-Object {
$Script:cboOffices.Items.Add($_) | Out-Null
}
还有$arr_Offices
和$cboOffices
填就好了
我做错了什么?
根据您的链接问题,$script:hash_AgencyOffices[$Script:selectedAdmin][$Script:selectedAgency]
生成一个字符串数组,它不会有 .Keys
属性.
你的数据结构是“有键的根哈希表,它们的值是有键的哈希表,它们的值是直接有内容的数组”。
因此您可以使用 AgencyOffices['division2'].Keys
和 AgencyOffices['division2']['subdivision1']
,但不能使用 AgencyOffices['division2']['subdivision1'].Keys
。