【问题标题】:Sort Hashtable and assign it to a new variable in Powershell对 Hashtable 进行排序并将其分配给 Powershell 中的新变量
【发布时间】:2011-01-11 09:52:31
【问题描述】:

我想知道如何使用以下命令将已排序的 hasttable 分配给新变量。我正在使用以下命令

$ht =   @{ 
           1 = "Data1"; 
           3 = "Data3"; 
           2 = "Data2"; 
         }

$htSorted = $ht.GetEnumerator() | Sort-Object Name

但运行后我无法遍历生成的哈希表

foreach($key in $htSorted.Keys)
{
     $item[$key]
}

有什么想法吗?

【问题讨论】:

  • 为我工作。 “它似乎不起作用”是什么意思?
  • 对不起,我的错..我的主要问题是我无法遍历生成的 hastable

标签: powershell powershell-2.0


【解决方案1】:

如果你需要一个排序的哈希表,你可以使用SortedDictionary。 示例:

$s = New-Object 'System.Collections.Generic.SortedDictionary[int, string]'
1..20 | % { 
  $i = (Get-Random -Minimum 0 -Maximum 100)
  write-host $i
  $s[$i] = $i.ToString() 
}
$s

我创建了 20 个随机值并将它们存储在字典中。然后当 PowerShell 遍历字典时(通过GetEnumerator()),值按键排序。

这可能比使用旧的哈希表和通过Sort-Object 排序要快得多。

【讨论】:

【解决方案2】:

运行$htSorted.GetType()$htSorted | GetMembers 后,Sort-Object cmdlet 返回一个字典条目数组。因此我可以简单地遍历它:

foreach($item in $htSorted)
{
     $item.Key
     $item.Value    
}

【讨论】:

  • +1。这里要理解的重要一点是:哈希表在条目上没有顺序;根据他们的定义,他们没有。并且排序的结果不再是哈希表。
  • 如果您执行以下操作:$this.HyperVHosts.Clone().GetEnumerator() | Sort-Object -Property Value -Descending 您将获得字典条目数组。但是您可以将它们分组回一个哈希表,这样:$this.HyperVHosts.Clone().GetEnumerator() | Sort-Object -Property Value -Descending | Group-Object -AsHashTable
【解决方案3】:

对 OP 的回答:

您正在正确设置排序的“哈希表”,但随后您写道:


foreach($key in $htSorted.Keys)
{
     $item[$key]
}

为了遍历已排序的“哈希表”,请使用以下代码:


foreach($item in $htSorted.GetEnumerator())
{
     write-host $item.key
     write-host $item.value
}

我也听说过排序的hastable本质上是不存在的,我不知道这是什么类型的对象,通过排序对象。但至少它的行为就像一个排序的哈希表:-)

【讨论】:

    猜你喜欢
    • 2020-06-29
    • 2019-03-04
    • 2022-11-20
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多