Powershell - 从数组创建HashTable

时间:2015-11-10 17:59:26

标签: powershell hashtable

是否已存在将两个大小相同的数组合并为HashTable或某些内联方法的zip函数?或者是在for循环中构建HashTable的唯一方法。

2 个答案:

答案 0 :(得分:1)

LINQ附带Zip() array extension method,它将第二个集合和一个选择器函数作为其参数 - 您可以将它与ToDictionary()方法一起使用完全你的内容想。

问题是PowerShell中没有LINQ的本地语言支持。

这意味着您必须在C#中编写辅助函数,使用Add-Type cmdlet进行编译然后调用它:

# Create C# helper function
$MemberDef = @'
public static Hashtable ZipIt(IEnumerable<object> first, IEnumerable<object> second)
{
    return new Hashtable(first.Zip(second, (k, v) => new { k, v }).ToDictionary(i => i.k, i => i.v));
}
'@

# Compile and add it to the current runtime
$RuntimeTypes = Add-Type -MemberDefinition $MemberDef -Name Zipper -PassThru -UsingNamespace System.Linq,System.Collections,System.Collections.Generic

# Add-Type emits a public type "Zipper" and an private anonymous type (the lambda expression from Zip())
# We're only interested in the "Zipper" class
$Zipper = $RuntimeTypes |Where-Object {$_.Name -eq 'Zipper'}

# Now zip away!
$Array1,$Array2 = @("a","b","c"),@(1,2,3)
$MyHashTable = $Zipper::ZipIt($Array1,$Array2)

$MyHashTable现在是一个常规哈希表:

PS C:\> $MyHashTable["b"]
2

答案 1 :(得分:0)

使用

1341486158

这就是它的全部内容,它从两个大小相同的数组中创建一个哈希表。

编辑:好的,我实际上是在努力使答案更加公正,但是谢谢你为我这样做。我还要添加指向Array classHashtable class的MSDN页面的链接以供参考。我认为没有任何构造函数或方法可以适应你想要做的事情。我假设这是因为Hashtable是一个键控字典,你不能有重复键,而数组允许你想要的重复数。