PowerShell函数返回具有返回类型不变的多个变量

时间:2019-06-13 03:42:42

标签: powershell

我想从函数中返回2个 public JsonResult GetNotesAsyncJson(string data) { var notes = this.noteService.SearchByTextAsync(data); var model = new SearchViewModel(); model.Notes = notes; return Json(model.Notes); } ,并且如果hashset<string>中只有1个字符串元素,我不想将其返回类型更改为字符串。

首先,要返回1个类型不变的变量,我们可以在变量前使用逗号来保持类型不变:

hashset<string>

然后,要返回多个变量并保留返回类型,我仍然可以在变量前使用逗号

Function Foo1 {
    $set1 = New-Object "System.Collections.Generic.HashSet[string]"
    $set1.Add("set 1") | Out-Null
    return ,$set1
}

$set1 = Foo1

但是第一个调用方法可能会得到错误的答案:

function Foo2 {
    $set1 = New-Object "System.Collections.Generic.HashSet[string]"
    $set2 = New-Object "System.Collections.Generic.HashSet[string]"

    $set1.Add("set 1") | Out-Null
    $set2.Add("set 2") | Out-Null
    return ,$set1, $set2
}

此调用方法可以获得正确答案:

$set1, $set2 = Foo2
Write-Host $set1.GetType() # System.Object[]
Write-Host $set2.GetType() # System.Collections.Generic.HashSet`1[System.String]

我的问题1: 这两种调用方法之间的区别是什么?为什么它们的行为有所不同?

我的问题2: 我们可以使用显式转换来保留返回类型而不是逗号吗?

,$set1, $set2 = Foo2
Write-Host $set1.GetType() # System.Collections.Generic.HashSet`1[System.String]
Write-Host $set2.GetType() # System.Collections.Generic.HashSet`1[System.String]

1 个答案:

答案 0 :(得分:0)

Comma operator

  

作为二进制运算符,逗号创建一个数组。作为一元运算符,逗号创建一个包含一个成员的数组。将逗号放在成员之前。

Foo2中,您将返回一个数组,其中第0个插槽包含一个带有入口(,$set2)的数组,第一个插槽包含一个哈希集(, $set1)。作为逗号运算符状态(= {As a unary ...)的描述。

Foo1中,您将返回一个只有一个条目(= $set1)的数组。

您应该重新考虑对PowerShell返回行为的理解。 PowerShell是面向管道的,这是因为:

  function Foo1 {
      ...
      return $set1
  }

返回一个string。原因:PowerShell将返回$set1的每个条目以实现此行为:

 Foo1 | Where-Object { $_ -like "*set 1*" }

基于此,您将能够过滤哈希集中包含的每个条目。

我认为您想要的是以下内容:

function Foo2 {
    $set1 = New-Object "System.Collections.Generic.HashSet[string]"
    $set2 = New-Object "System.Collections.Generic.HashSet[string]"

    $set1.Add("set 1") | Out-Null
    $set2.Add("set 2") | Out-Null
    $rv = @()
    $rv += $set1
    $rv += $set2
    # every entry of $rv1 is returned "seperatly"
    $rv
}

# $result[0]  will return hashset1
$result = Foo2

另一种选择是从Foo2返回两个数组,其中只有一个条目:

function Foo2 {
    $set1 = New-Object "System.Collections.Generic.HashSet[string]"
    $set2 = New-Object "System.Collections.Generic.HashSet[string]"

    $set1.Add("set 1") | Out-Null
    $set2.Add("set 2") | Out-Null

    , $set1
    , $set2

}

您还应该阅读有关PowerShells return关键字的文档,该文档的行为与其他脚本语言不同。

希望有帮助。