我想从函数中返回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]
答案 0 :(得分:0)
作为二进制运算符,逗号创建一个数组。作为一元运算符,逗号创建一个包含一个成员的数组。将逗号放在成员之前。
在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关键字的文档,该文档的行为与其他脚本语言不同。
希望有帮助。