如何在PowerShell中将HashSet转换为ArrayList?

9
我需要将一个HashSet转换为ArrayList?
$hashset = New-Object System.Collections.Generic.HashSet[int]
$hashset.Add(1)
$hashset.Add(2)
$hashset.Add(3)

$arraylist = New-Object System.Collections.ArrayList
# Now what?

你尝试过使用[array]$arraylist = $hashset吗?在此之后,这两个变量仍然可以使用相同的输出管道"get-member"。创建数组与"hashset"相比,你的目标是什么? - Robert Cotterman
@RobertCotterman 我需要一个ArrayList。数组是固定大小的,没有Sort()方法。 - Daniel
1
Daniel,PowerShell中的数组可以使用Sort-Object进行排序,并且您可以向它们添加项目(这将创建一个新数组来执行此操作,但从语言角度来看,类型并不重要——除非当然,您完全ed ArrayList传递给需要它的方法。但我希望这样的API现在已经过时了。) - Joey
@Joey 我经常更喜欢使用ArrayList或List,因为PowerShell处理数组的方式,特别是在添加新项时,非常慢 - marsze
@Joey 列表可能会变得非常大,我不想每次添加一个项目时都复制大型列表。此外,我还需要 GetRange(),而这也不受 Sort-Object 返回的数组支持。 - Daniel
@marze: 的确,使用列表来添加细节是更可取的。我只是倾向于以尽可能少地改变集合的方式编写PowerShell,并尽可能使用管道进行此类操作。当然,并非总是可行或方便。 - Joey
3个回答

7

使用CopyTo的一种方法:

$array = New-Object int[] $hashset.Count
$hashset.CopyTo($array)
$arraylist = [System.Collections.ArrayList]$array

另一种方式(更短,但对于大的哈希集较慢):

$arraylist = [System.Collections.ArrayList]@($hashset)

此外,我强烈建议优先使用List而不是ArrayList,因为自从引入泛型以来,ArrayList已经过时了。
$list = [System.Collections.Generic.List[int]]$hashset

不知道列表。谢谢。 - Daniel
1
不错,List[int]++。值得注意的是,如果您使用的是PowerShell >5.0,则构造函数直接将任何IEnumerable[int](包括HashSet[int])作为其参数,比强制转换更快:[System.Collections.Generic.List[int]]::new($hashset) - Mathias R. Jessen
https://blogs.msdn.microsoft.com/powershell/2013/06/11/understanding-powershells-type-conversion-magic/ - marsze
@marsze 是的,但由于 @(),集合首先被扩展为一个数组。如果我直接将其传递给构造函数,则可以在大约10毫秒内返回新列表,而如果使用您的转换,则随着集合变得越来越大,速度会变慢 :) - Mathias R. Jessen
1
@MathiasR.Jessen 我已经在我的回答中删除了@(),因为你正确地指出它是不必要的。使用List而不是ArrayList的另一个好处是,你可以直接进行强制类型转换,速度大致相同,因为它(很可能)在内部使用构造函数。 - marsze
显示剩余2条评论

4

不确定这是否符合您的需求,但这是您要的内容...

$hashset = New-Object System.Collections.Generic.HashSet[int]
$null = $hashset.Add(1)
$null = $hashset.Add(2)
$null = $hashset.Add(3)
# @($hashset) converts the hashset to an array which is then 
# converted to an arraylist and assigned to a variable
$ArrayList = [System.Collections.ArrayList]@($hashset)

1

您还可以使用foreach循环将hashtable中的每个项目添加到array中:

$hashset = New-Object System.Collections.Generic.HashSet[int]
$hashset.Add(1)
$hashset.Add(2)
$hashset.Add(3)

$arraylist = New-Object System.Collections.ArrayList
# Now what?
foreach ($item in $hashset){
    $arraylist.Add($item)
}

2
你应该使用$arraylist.Add($item) | Out-Null或者[void]$arraylist.Add($item)来防止不需要的输出到管道。 - marsze
谢谢。目前我是这样做的。但对于我的口味来说过于啰嗦了。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接