我要这个:
New-Object System.Collections.Generic.List[System.Collections.Generic.Tuple[int,string]]
Run Code Online (Sandbox Code Playgroud)
在PowerShell中,
New-Object System.Collections.Generic.List[System.Collections.Generic.Tuple[int,string]]
Run Code Online (Sandbox Code Playgroud)
不起作用.我错过了什么?
Lee的答案是创建元组列表的正确方法(尽管省略System命名空间可以使语句更短).但是,在PowerShell中编程时要问的更好的问题是:
第一个有它的优点和缺点.如果强类型对象具有对管道中的下一步有用的方法或事件,则返回它们非常有用.另一方面,如果你只想返回一堆名为int的项,我会使用类似的东西:
New-Object PSObject -Property @{string="string";int=1}
Run Code Online (Sandbox Code Playgroud)
这将创建一个包含所需数据的属性包(大多数开发人员都知道为元组),使用比.NET元组更具描述性的名称将为您提供对象.它也很快.另一方面,如果数据是针对API的,那么通过一切手段创建它所期望的强类型对象.
第二个问题有点难以理解,但答案要清楚得多.在许多情况下,您需要从一个函数的输出接受另一个函数的输入.在这种情况下,由于许多原因,强类型列表不是您最好的朋友.强类型列表并不总是清楚地转换为数组(对于泛型尤其如此),并且,作为函数的参数,严格限制可以放入函数的不同类型的数据.它们最终也会提供一些误导性和难以使用的输出(特别是当在对象中进行管道并产生多个结果时),因为整个列表将显示为一个输出项目,而不是单独显示每个项目.最令人讨厌的是,当你"过度索引"时,强类型列表的行为与PowerShell中的数组不同(i.即 在5个项目的列表中询问项目10000)数组将悄然返回null.列表将大声抨击.更实际的是,将项目累积到列表然后输出列表将"保持"管道,直到所有项目都在.这可能是你想要的,但在大多数情况下,很高兴看到输出来自函数运行.最后,列表会增加函数的内存开销,因为您需要在函数的堆栈中累积一组对象.
我通常做的只是发出多个对象.也就是说,我避免使用return关键字,并利用PowerShell的功能将未捕获的对象返回到变量中.如果我将结果分配给变量,则项目将在arraylist中累积并作为数组返回给您.这个快速的小演示功能向您展示如何.
function Get-RandomData {
param($count = 10)
foreach ($n in 1..$count){
New-Object PSObject -Property @{Name="Number$n";Number=Get-Random}
}
}
Run Code Online (Sandbox Code Playgroud)
值得注意的是,专门的集合仍然非常有用.我经常在需要时使用队列和堆栈.但是,我很少发现自己使用泛型或列表,除非我正在使用特定需要泛型或列表的.NET的一部分.这非常具有讽刺意味,因为我是在PowerShell V2中测试对泛型的支持的人.当您想要使用只能获取元组列表的.NET时,绝对需要它.在所有其他情况下,它会轻微地适得其反.
你可以创建它:
New-Object 'Collections.Generic.List[Tuple[int,string]]'
Run Code Online (Sandbox Code Playgroud)
你错误地拼写Generic,并且Tuple类型在System命名空间中,而不是System.Collections.Generic.
这对我有用。我还提供了要插入到列表中的示例代码:
$myList = New-Object System.Collections.ArrayList
#add range
$myList.AddRange((
[Tuple]::Create(1,"string 1"),
[Tuple]::Create(2,"string 2"),
[Tuple]::Create(3,"string 3")
));
#add single item
$myList.Add([Tuple]::Create(4,"string 4"))
#create variable and add to list
$myTuple = [Tuple]::Create(5,"string 5")
$myList.Add( $myTuple)
Write-Host $myList
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6978 次 |
| 最近记录: |