1

我感到很困惑。我不明白为什么 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 在这里做什么?

4

1 回答 1

3

PowerShell 管道将“展开”数组和集合(一级),但不是哈希表。如果要在 PowerShell 中枚举哈希表的键值对,请调用 .getenumerator() 方法:

$ht = @{a=1;b=2}
$ht.GetEnumerator()



Name                           Value                                                             
----                           -----                                                             
a                              1                                                                 
b                              2    
于 2013-02-20T03:02:02.707 回答