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,而前者写入主机控制台。主机和流输出的显示顺序可能与您期望的不同。