我想在PowerShell中创建List<Tuple<int,string>>
,但是
New-Object System.Collections.Generic.List[System.Collections.Generic.Tuple[int,string]]
不起作用。我想念什么?
请您参考如下方法:
Lee的答案是创建元组列表的正确方法(尽管您可以通过省略System命名空间来使语句更短)。但是,在PowerShell中进行编程时要问的更好的问题是:
第一个优点和缺点。如果强类型对象具有对管道中的下一步有用的方法或事件,则对它们很有用。另一方面,如果您只想返回一堆名称为int的项目,则可以使用以下方法:
New-Object PSObject -Property @{string="string";int=1}
这将创建一个属性包(大多数开发人员称为Tuple),其中包含您需要的数据,其描述性名称比.NET元组为您提供的对象要多。它也非常快。另一方面,如果数据用于API,则必须通过各种方式创建它期望的强类型对象。
第二个问题较难理解,但答案更为明确。在许多情况下,您会希望从一个函数的输出接受另一个函数的输入。因此,出于多种原因,强类型列表不是您最好的 friend 。强类型列表并不总是清楚地转换为数组(对于泛型而言尤其如此),并且作为函数的参数严格限制了可放入函数中的不同数据类型。由于整个列表将显示为一个输出项目,而不是单独显示每个项目,因此,它们最终还提供了一些误导且更难使用的输出(尤其是在管道输送对象并产生多个结果时)。最令人讨厌的是,当您“过度索引”时(即在5个项目的列表中要求输入10000),强类型列表的行为与PowerShell中的数组不同。数组将安静地返回null。列表会大声叫bar。实际上,将项目累加到列表中然后输出列表将“保留”管道,直到所有项目都放入为止。这可能是您想要的,但是在大多数情况下,很高兴看到函数运行时输出。最后,列表需要增加函数的内存开销,因为您需要在函数堆栈中累积一组对象。
我通常所做的只是发出多个对象。也就是说,我避免使用return关键字,并且利用PowerShell的功能来返回未捕获到变量中的对象。如果将结果分配给变量,则这些项将累积在arraylist中,并作为数组返回给您。这个快速的小演示功能向您展示了如何。
function Get-RandomData {
param($count = 10)
foreach ($n in 1..$count){
New-Object PSObject -Property @{Name="Number$n";Number=Get-Random}
}
}
值得注意的是,专业收藏仍然非常有用。当需要时,我经常使用队列和堆栈。但是,除非我使用的是.NET中专门要求使用泛型或列表的部分,否则我很少会使用泛型或列表。这是个人讽刺意味,因为我是在PowerShell V2中测试对泛型支持的人。当您要使用只能包含一个元组列表的.NET片段时,这是绝对必需的。在所有其他情况下,这都会适得其反。