PowerShell中的元组< int,字符串>列表

xcitsw88  于 2022-11-10  发布在  Shell
关注(0)|答案(4)|浏览(110)

我想在PowerShell中创建一个List<Tuple<int,string>>,但是

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

不起作用。我遗漏了什么?

8e2ybdfx

8e2ybdfx1#

Lee的答案是创建元组列表的正确方法(尽管您可以通过省略System命名空间来缩短语句)。然而,在PowerShell中编程时更好的问题是:

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

第一种方法有它的利弊。如果强类型对象具有对管道中的下一步有用的方法或事件,则返回这些对象非常有用。另一方面,如果您只想返回一组名称为int的项,我将使用类似于:

[PSCustomObject]@{string="string";int=1}

这将创建一个包含所需数据的属性包(大多数开发人员称之为Tuple),它具有比.NET tuple为您提供的对象更具描述性的名称。这也是相当快的。另一方面,如果数据是用于API的,那么一定要创建它所期望的强类型对象。
第二个问题有点难理解,但答案要清楚得多。在许多情况下,您可能希望从一个函数的输出中接受另一个函数的输入。在这一点上,出于许多原因,强类型列表不是您最好的朋友。强类型列表并不总是清楚地转换为数组(对于泛型尤其如此),并且作为函数的参数,严重限制了可以输入到函数中的不同类型的数据。由于整个列表将显示为一个输出项,而不是单独显示每个项,因此它们最终还提供了一些误导性的输出(特别是在输入对象并产生多个结果时)。最令人恼火的是,强类型列表的行为与PowerShell中的数组不同,当您“过度索引”(即在5个项的列表中请求10000项)数组时,数组将悄悄返回空值。名单上的人会大声呕吐。更实际的情况是,将项目累积到一个列表中,然后输出该列表将“保持”管道,直到所有项目都进入。这可能是您想要的,但在大多数情况下,看到函数在运行时输出是很好的。最后,列表增加了函数的内存开销,因为您需要在函数的堆栈中累积一组对象。
我通常所做的只是发射多个对象。也就是说,我避免使用RETURN关键字,并且利用PowerShell的能力来返回未捕获到变量中的对象。如果我将结果赋给一个变量,这些项将在数组列表中累加并以数组的形式返回给您。这个快速的小演示函数向您展示了如何操作。

function Get-RandomData {
     param($count = 10)

     foreach ($n in 1..$count){
         [PSCustomObject]@{Name="Number$n";Number=Get-Random}
     }
}

值得注意的是,专门的收藏仍然非常有用。当需要时,我经常使用队列和堆栈。然而,我发现自己很少使用泛型或列表,除非我使用的是.NET中特别需要泛型或列表的部分。这非常具有个人讽刺意味,因为我是测试PowerShellV2中对泛型的支持的人。当您想要使用一段只能接受元组列表的.NET时,它是绝对必需的。在所有其他情况下,这都是轻微到严重的适得其反。

6g8kf2rb

6g8kf2rb2#

您可以使用以下命令创建它:

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

您的Generic拼写错误,Tuple类型位于System命名空间中,而不是System.Collections.Generic

bakd9h0s

bakd9h0s3#

这就是对我起作用的方法。我还提供了插入到列表中的示例代码:

$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

szqfcxe2

szqfcxe24#

您可以创建最多包含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))

在内部,第八个元素被称为“休息”。您可以获得如下值:

$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)

不需要指定用于创建列表的元组细节。
请记住,以后不能更改元组的值,默认的排序方法按items1、item2等的顺序升序排序(或者您需要一个定制的ICompeller),但是使用它们非常快(比处理PsObject或PSCustomObject的大列表要快得多,也比导入-CSV快得多)!

相关问题