PowerShell中的元组<int,string>列表</int,string>

时间:2013-10-29 20:56:38

标签: powershell

我想要这个:

List<Tuple<int,string>> 
在PowerShell中

New-Object System.Collections.Genergic.List[ System.Collections.Genergic.Tuple[int,string] ]

不起作用。我错过了什么?

4 个答案:

答案 0 :(得分:9)

Lee的答案是创建元组列表的正确方法(尽管省略System命名空间可以使语句更短)。但是,在PowerShell编程时要问的更好的问题是:

  • 为什么要返回强类型对象?
  • 我真的想输出一个列表吗?

第一个有它的优点和缺点。如果强类型对象具有对管道中的下一步有用的方法或事件,则返回它们非常有用。另一方面,如果你只想返回一堆名为int的项目,我会使用类似的东西:

New-Object PSObject -Property @{string="string";int=1} 

这将创建一个包含所需数据的属性包(大多数开发人员都知道为元组),使用比.NET元组更具描述性的名称将为您提供对象。它也很快。另一方面,如果数据是针对API的,那么一定要创建它所期望的强类型对象。

第二个问题有点难以理解,但答案要清楚得多。在许多情况下,您需要从一个函数的输出接受另一个函数的输入。在这种情况下,由于许多原因,强类型列表不是您最好的朋友。强类型列表并不总是清楚地转换为数组(对于泛型尤其如此),并且,作为函数的参数,严格限制可以放入函数的不同类型的数据。它们最终也会提供一些误导性和难以使用的输出(特别是当在对象中进行管道并产生多个结果时),因为整个列表将显示为一个输出项目,而不是单独显示每个项目。最令人讨厌的是,当你“过度索引”(即在5个项目的列表中询问项目10000)时,强类型列表的行为与PowerShell中的数组不同,数组将静静地返回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}
     }
}

值得注意的是,专门的收藏品仍然非常有用。我经常在需要时使用队列和堆栈。但是,我很少发现自己使用泛型或列表,除非我正在使用特定需要泛型或列表的.NET的一部分。这非常具有讽刺意味,因为我是在PowerShell V2中测试对泛型的支持的人。当您想要使用只能获取元组列表的.NET时,绝对需要它。在所有其他情况下,它会略微适得其反。

答案 1 :(得分:8)

您可以使用以下方式创建它:

New-Object 'Collections.Generic.List[Tuple[int,string]]'

您正在拼错Generic,而Tuple类型位于System命名空间,而不是System.Collections.Generic

答案 2 :(得分:3)

这对我有用。我还提供了插入列表的示例代码:

$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

参考: Using and Understanding Tuples in PowerShell

答案 3 :(得分:0)

您最多可以创建一个包含以下7个元素的元组:

$tuple = [tuple]::Create(1,2,3,4,5,6,7)

,您可以通过命名元素的项(从item1开始)来获得其值:

$tuple.item1
1

如果您有8个或更多元素,则将另一个元组用作第8个元素:

$tuple = [tuple]::Create(1,2,3,4,5,6,7,[tuple]::create(8,9))

在内部,第8个元素称为“休息”。您可以得到像这样的值:

$tuple.rest.item1.item1
8

如果您需要为每个元素指定一种类型,请在每个值的前面进行操作:

$tuple = [tuple]::create([string]"a", [int]1, [byte]255)

最后,将元组添加到列表的方式如下:

$list = New-Object 'Collections.ArrayList'
$tuple = [tuple]::create([string]"a", [int]1, [byte]255)
$list.add($tuple)

无需指定用于创建列表的元组细节。

请记住,您以后不能更改元组的值,并且默认的sort-method会按item1,item2等的顺序对升序进行排序(或者您需要自定义IComparer),但是使用它们非常快(比使用大型PsObject或PSCustomObject列表要快得多,也比import-Csv更快!

相关问题