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

Posted

技术标签:

【中文标题】如何在 PowerShell 中将 HashSet 转换为 ArrayList?【英文标题】:How to convert a HashSet to an ArrayList in PowerShell? 【发布时间】:2019-03-28 11:01:44 【问题描述】:

我需要将 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”。您创建数组与“哈希集”的目标是什么 @RobertCotterman 我需要一个 ArrayList。数组是固定大小的,没有Sort() Daniel,Powershell 中的数组可以使用 Sort-Object 进行排序,您可以向其中添加项目(它将创建一个新数组来执行此操作,但从语言的角度来看,这并不重要类型是 -- 当然,除非你完全编辑了 ArrayList 以传递给需要它的方法。但我希望这样的 API 现在早就死了。) @Joey 我通常更喜欢使用 ArrayList 或 List,因为 PowerShell 处理数组的方式,尤其是在添加新项目时,太慢了 @Joey 列表可能会变得很大,我不想每次添加一个项目时都复制大列表。除此之外,我还需要GetRange()Sort-Object 返回的数组也不支持它。 【参考方案1】:

一种方式,使用CopyTo

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

另一种方式(更短,但对于大型哈希集来说更慢):

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

另外,我强烈建议支持 List 而不是 ArrayList,因为自从引入泛型以来,它几乎是 deprecated:

$list = [System.Collections.Generic.List[int]]$hashset

【讨论】:

不知道列表。谢谢。 不错,List[int]++。值得注意的是,如果您使用 PowerShell >5.0,则构造函数将任何 IEnumerable[int](包括 HashSet[int])直接作为其参数,比强制转换更快:[System.Collections.Generic.List[int]]::new($hashset) @MathiasR.Jessen 如果它更快,您是否真的尝试过?因为如果可能的话,PowerShell 的强制转换确实隐式使用了构造函数。 blogs.msdn.microsoft.com/powershell/2013/06/11/… @MathiasR.Jessen 我已经在我的回答中删除了@(),正如您正确指出的那样,这是不必要的。 另一个使用List而不是ArrayList的好处!然后你可以做演员,它的速度与在内部使用构造函数的速度差不多。【参考方案2】:

不确定这是否是你所追求的,但它就在这里......

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

【讨论】:

【参考方案3】:

您还可以使用foreach 循环添加从hashtablearray 的每个项目:

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

【讨论】:

您应该使用$arraylist.Add($item) | Out-Null[void]$arraylist.Add($item) 来防止不必要的输出到管道。 谢谢。我现在就是这样做的。但这对我来说是不必要的冗长。

以上是关于如何在 PowerShell 中将 HashSet 转换为 ArrayList?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PowerShell 中将 curl 结果作为变量获取

如何在 PowerShell 中将文件作为流逐行处理

如何在powershell中将变量放入文件名

如何在 PowerShell 中将计算值写入 SQL INSERT/UPDATE

如何在 RegEx 替换中将 RegEx 令牌传递给 PowerShell 子表达式?

如何在powershell中将嵌套的任意关联数组值设置为.psd1文件?