Hashtable与关于迭代的自定义对象数组

时间:2017-05-19 16:48:16

标签: powershell hashtable key-value-store

我经常编写事物列表并对它们执行枚举以执行一些get / set。

我讨厌枚举哈希表,因为无论什么时候我必须这样做,我都要向后弯腰以使用hashtable个对象。

$hashtablelistofitems = @{}

$hashtablelistofitems.add("i'm a key", "i'm a value")

foreach ($item in $hashtablelistofitems.keys) {
  $item
  $hashtablelistofitems.item($item)
}

相反,我通常会恢复使用具有两个noteproperties的自定义对象的单维数组。

$array = @()

$listofitems = "" | select key,value

$listofitems.key = "i'm a key"
$listofitems.value = "i'm a value"

$array += $listofitems

foreach ($item in $listofitems) {
  $item.key
  $item.value
}

为什么我应该使用hashtable这个方法?仅仅因为它只保证每个键的单个值?

2 个答案:

答案 0 :(得分:6)

如果要存储键值列表而不创建包含具有两个属性(键/值)的自定义对象的数组,则应使用哈希表,主要有两个原因:

  1. 您可能希望将哈希表传递给期望哈希表的函数。
  2. Hashtable是用户了解的内置 PowerShell类型。您的第二种方法更难以为其他用户阅读/维护。
  3. 注意: 您可以通过调用GetEnumerator()函数来迭代哈希表,几乎与您的方法相同:

    foreach ($item in $listofitems.GetEnumerator()) {
      $item.key
      $item.value
    }
    

    此外,散列表带有您可能想要使用的方便方法:

    @{} | Get-Member | Where-Object MemberType -eq Method | Select Name
    

    <强>输出:

    Name             
    ----             
    Add              
    Clear            
    Clone            
    Contains         
    ContainsKey      
    ContainsValue    
    CopyTo           
    Equals           
    GetEnumerator    
    GetHashCode      
    GetObjectData    
    GetType          
    OnDeserialization
    Remove           
    ToString  
    

答案 1 :(得分:2)

这远不如马丁的纲要那么有用,但它足够有用。

这是一篇关于如何在Hashtables和PSCustomObjects之间来回转换的MSDN文章。 The article