Foreach 循环和散列 table 有两个值:
Foreach loop and hash table with two values:
示例 01 - 下面是我在更复杂的 script.This 代码中使用的简化代码示例。
问题是我希望能够控制两组值(网站名称和 URL)在 foreach 循环中的处理顺序。
我知道 hash-tables 不按数据列出的顺序处理数据,而是以一种看似随机的方式列出数据。
我尝试了什么:
我已经通过一本书 google 和堆栈交换对此进行了一些研究。
我已尝试使用 GetEnumerator 命令及其关联的 "sort name" 选项,如下面的示例 02 所示。此示例适用于此上下文 - 它成功地根据网站名称的字母顺序列出了网站。但是我不想按字母顺序列出,而是按照规定的顺序列出。如果需要手动完成订购,那将是
很好,但我不知道如何实现这一目标。此外,当我尝试将此方法与我的实际脚本一起使用时,脚本将 运行 但在本节中它将显示“ System.Collections.DictionaryEntry”,而不是正确地 运行ning 脚本。也许我在这里 运行 没有正确设置它。
我还尝试了什么:
我还尝试了使用两个值的散列-table - 网站名称和字母表中的一个字母。这成功地按照我使用字母表中的字母规定的顺序列出了站点,但是我的实际脚本需要有两个值——网站名称和 URL——用于管理
运行脚本的宁。
我还尝试在散列中使用三个值-table - 以为我可能已经看到一个说明这是可能的 - 但是即使这可能我也找不到使它工作的语法.
最后的想法:
我想知道您是否可以使用两个 hash-tables 来解决这个问题——一个设置 foreach 循环处理值的顺序(按照下面的示例 03),另一个提供实际值在 foreach 循环中使用(根据示例 01)。
这是一个可能的解决方案还是某种替代方案?
有没有其他方法可以以合理的方式实现这一点?
提前致谢。
示例 01
$Sites = @{
'DuckDuckGo' = 'https://duckduckgo.com'
'Google' = 'https://www.google.com'
'Ixquick' = 'https://www.ixquick.com'
'Yahoo ' = 'https://search.yahoo.com'
'Dogpile' = 'http://www.dogpile.com'
'Yippee ' = 'http://www.yippy.com'
}
clear
write-host "`n`n`n"
foreach ($name in $Sites.Keys) {
write-host
"`t`t {0} `t`t`t {1}" -f $name , $Sites[$name]
write-host
}
示例 02
$Sites = @{
'DuckDuckGo' = 'https://duckduckgo.com'
'Google' = 'https://www.google.com'
'Ixquick' = 'https://www.ixquick.com'
'Yahoo ' = 'https://search.yahoo.com'
'Dogpile' = 'http://www.dogpile.com'
'Yippee ' = 'http://www.yippy.com'
}
clear
write-host "`n`n`n"
foreach($name in $Sites.GetEnumerator() | Sort Name)
{
$name
}
write-host "`n`n`n`n"
示例 03
$Sites = @{
'DuckDuckGo' = 'a'
'Google' = 'f'
'Ixquick' = 'c'
'Yahoo ' = 'z'
'Dogpile' = 'e'
'Yippee ' = 'b'
}
$Sites.GetEnumerator() | Sort Value
你想的太复杂了。只需对哈希表的键进行排序,如下所示:
$Sites.Keys | Sort-Object | ForEach-Object {
"{0}`t{1}" -f $_, $Sites[$_]
}
或者像这样:
foreach ($name in ($Sites.Keys | Sort-Object)) {
"{0}`t{1}" -f $name, $Sites[$name]
}
如果您希望哈希表的元素从一开始就按特定顺序排列,请创建一个有序的哈希表:
$Sites = [ordered]@{
'DuckDuckGo' = 'https://duckduckgo.com'
'Google' = 'https://www.google.com'
'Ixquick' = 'https://www.ixquick.com'
'Yahoo ' = 'https://search.yahoo.com'
'Dogpile' = 'http://www.dogpile.com'
'Yippee ' = 'http://www.yippy.com'
}
附带说明:不要混合使用 Write-Host
和 PowerShell 默认输出(回显裸字符串)。他们做不同的事情。后者写入 success output stream,而前者写入主机控制台。主机和流输出的显示顺序可能与您期望的不同。
示例 01 - 下面是我在更复杂的 script.This 代码中使用的简化代码示例。
问题是我希望能够控制两组值(网站名称和 URL)在 foreach 循环中的处理顺序。
我知道 hash-tables 不按数据列出的顺序处理数据,而是以一种看似随机的方式列出数据。
我尝试了什么: 我已经通过一本书 google 和堆栈交换对此进行了一些研究。
我已尝试使用 GetEnumerator 命令及其关联的 "sort name" 选项,如下面的示例 02 所示。此示例适用于此上下文 - 它成功地根据网站名称的字母顺序列出了网站。但是我不想按字母顺序列出,而是按照规定的顺序列出。如果需要手动完成订购,那将是 很好,但我不知道如何实现这一目标。此外,当我尝试将此方法与我的实际脚本一起使用时,脚本将 运行 但在本节中它将显示“ System.Collections.DictionaryEntry”,而不是正确地 运行ning 脚本。也许我在这里 运行 没有正确设置它。
我还尝试了什么: 我还尝试了使用两个值的散列-table - 网站名称和字母表中的一个字母。这成功地按照我使用字母表中的字母规定的顺序列出了站点,但是我的实际脚本需要有两个值——网站名称和 URL——用于管理 运行脚本的宁。
我还尝试在散列中使用三个值-table - 以为我可能已经看到一个说明这是可能的 - 但是即使这可能我也找不到使它工作的语法.
最后的想法: 我想知道您是否可以使用两个 hash-tables 来解决这个问题——一个设置 foreach 循环处理值的顺序(按照下面的示例 03),另一个提供实际值在 foreach 循环中使用(根据示例 01)。
这是一个可能的解决方案还是某种替代方案? 有没有其他方法可以以合理的方式实现这一点?
提前致谢。
示例 01
$Sites = @{
'DuckDuckGo' = 'https://duckduckgo.com'
'Google' = 'https://www.google.com'
'Ixquick' = 'https://www.ixquick.com'
'Yahoo ' = 'https://search.yahoo.com'
'Dogpile' = 'http://www.dogpile.com'
'Yippee ' = 'http://www.yippy.com'
}
clear
write-host "`n`n`n"
foreach ($name in $Sites.Keys) {
write-host
"`t`t {0} `t`t`t {1}" -f $name , $Sites[$name]
write-host
}
示例 02
$Sites = @{
'DuckDuckGo' = 'https://duckduckgo.com'
'Google' = 'https://www.google.com'
'Ixquick' = 'https://www.ixquick.com'
'Yahoo ' = 'https://search.yahoo.com'
'Dogpile' = 'http://www.dogpile.com'
'Yippee ' = 'http://www.yippy.com'
}
clear
write-host "`n`n`n"
foreach($name in $Sites.GetEnumerator() | Sort Name)
{
$name
}
write-host "`n`n`n`n"
示例 03
$Sites = @{
'DuckDuckGo' = 'a'
'Google' = 'f'
'Ixquick' = 'c'
'Yahoo ' = 'z'
'Dogpile' = 'e'
'Yippee ' = 'b'
}
$Sites.GetEnumerator() | Sort Value
你想的太复杂了。只需对哈希表的键进行排序,如下所示:
$Sites.Keys | Sort-Object | ForEach-Object {
"{0}`t{1}" -f $_, $Sites[$_]
}
或者像这样:
foreach ($name in ($Sites.Keys | Sort-Object)) {
"{0}`t{1}" -f $name, $Sites[$name]
}
如果您希望哈希表的元素从一开始就按特定顺序排列,请创建一个有序的哈希表:
$Sites = [ordered]@{
'DuckDuckGo' = 'https://duckduckgo.com'
'Google' = 'https://www.google.com'
'Ixquick' = 'https://www.ixquick.com'
'Yahoo ' = 'https://search.yahoo.com'
'Dogpile' = 'http://www.dogpile.com'
'Yippee ' = 'http://www.yippy.com'
}
附带说明:不要混合使用 Write-Host
和 PowerShell 默认输出(回显裸字符串)。他们做不同的事情。后者写入 success output stream,而前者写入主机控制台。主机和流输出的显示顺序可能与您期望的不同。