是否已存在将两个大小相同的数组合并为HashTable或某些内联方法的zip函数?或者是在for循环中构建HashTable的唯一方法。
答案 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 class和Hashtable class的MSDN页面的链接以供参考。我认为没有任何构造函数或方法可以适应你想要做的事情。我假设这是因为Hashtable是一个键控字典,你不能有重复键,而数组允许你想要的重复数。