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

PowerShell转换从函数返回的值。如何避免这种情况?

  •  5
  • alex2k8  · 技术社区  · 15 年前

    我正在尝试从PowerShell函数返回list<t>,但得到一个:

    1. 空-空列表
    2. system.int32-用于包含一个元素的列表
    3. System.Object[]-用于包含更多元素的列表

    代码:

    function CreateClrList
    {
        $list = New-Object "System.Collections.Generic.List``1[System.Int32]"
        $list.Add(3)
        $list
    }
    
    Write-Host (CreateClrList).GetType()
    
    3 回复  |  直到 12 年前
        1
  •  9
  •   user83286    15 年前

    是的,PowerShell会展开所有集合。一种解决方案是使用一元逗号返回包含实际集合的集合:

    function CreateClrList
    {
        $list = New-Object "System.Collections.Generic.List``1[System.Int32]"
        $list.Add(3)
        ,$list
    }
    
        2
  •  1
  •   Ludovic Chabant    15 年前

    注意大多数时候,你 希望 PowerShell可以展开可枚举类型,以便管道命令更快地执行,并具有更早的用户反馈,因为管道中的命令可以开始处理第一个项并提供输出。

        3
  •  0
  •   Community Keith    7 年前

    如果需要返回整数列表,请使用 jachymko's solution .

    否则,如果您不特别关心得到的是列表还是数组,但只想遍历结果,则可以在枚举时将结果包装为@(),例如。

    $fooList = CreateClrList
    foreach ($foo in @($fooList))
    {
        ...
    }
    

    那会导致 @($fooList) 数组类型-空数组、一个元素的数组或多个元素的数组。