代码之家  ›  专栏  ›  技术社区  ›  scobi

Powershell中的枚举与管道

  •  1
  • scobi  · 技术社区  · 12 年前

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

    1 回复  |  直到 12 年前
        1
  •  3
  •   mjolinor    12 年前

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

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