我很困惑。我无法理解为什么Powershell中的foreach与C#的行为有如此不同。
这个简单的代码不产生输出:
@{a=1; b=2} | %{ $_.key }
我在Linqpad中使用C#做的近似值给出了我期望的输出:
var ht = new Hashtable();
ht["a"] = 1;
ht["b"] = 2;
foreach (DictionaryEntry kvp in ht)
{
kvp.Key.Dump();
}
// output
a
b
如果我枚举散列表的Keys成员,我可以做我需要的。但我不明白为什么枚举哈希表本身不会返回键值对。实际上它似乎返回了对象本身:
> @{a=1; b=2} | %{ $_.gettype() }
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Hashtable System.Object
Powershell在这做什么?
答案 0 :(得分:3)
PowerShell管道将“展开”数组和集合(一个级别),但不会散列表。如果要在PowerShell中枚举哈希表的键值对,请调用.getenumerator()方法:
$ht = @{a=1;b=2}
$ht.GetEnumerator()
Name Value
---- -----
a 1
b 2