【问题标题】:Foreach loop and hash table with two values:Foreach 循环和哈希表有两个值:
【发布时间】:2016-06-13 02:48:37
【问题描述】:

示例 01 - 下面是我在更复杂的脚本中使用的代码的简化示例。此代码有效。

问题是我希望能够控制通过 foreach 循环处理两组值(网站名称和 URL)的顺序。

我了解哈希表不会按照它们列出的顺序处理数据,而是以看似随机的方式将其列出。

我尝试了什么: 我通过一本书、谷歌和堆栈交换对此进行了一些研究。

我已尝试使用 GetEnumerator 命令及其关联的“排序名称”选项,如下面的示例 02 所示。此示例适用于这种情况 - 它成功地根据站点名称的字母顺序列出了站点。但是我不想按字母顺序列出,而是按照规定的顺序列出。如果订购需要手动完成,那将是 很好,但我不知道如何实现这一点。此外,当我尝试将此方法与我的实际脚本一起使用时,脚本将运行,但在本节中它将显示“System.Collections.DictionaryEntry”,而不是正确运行脚本。也许我在这里运行不正确。

我还尝试了什么: 我还尝试了一个使用两个值的哈希表——站点名称和一个字母。这成功地按照我使用字母表规定的顺序列出了网站,但我的实际脚本需要有两个值 - 网站名称和 URL - 用于管理 运行脚本。

我还尝试在哈希表中使用三个值 - 以为我可能已经看到一个说明这是可能的 - 但是如果这甚至可能,我找不到使这项工作的语法。

最后的想法: 我想知道您是否可以使用两个哈希表来解决这个问题 - 一个设置 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 

【问题讨论】:

    标签: foreach hashtable powershell-4.0


    【解决方案1】:

    你想得太复杂了。只需对哈希表的键进行排序,如下所示:

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

    【讨论】:

    • 太棒了!使用有序的哈希表。完美的解决方案。再次感谢 Ansgar !!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2014-11-28
    • 2023-01-10
    • 2021-07-08
    • 2014-06-22
    • 1970-01-01
    • 2015-06-10
    相关资源
    最近更新 更多