如何在 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
循环添加从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)
【讨论】:
您应该使用$arraylist.Add($item) | Out-Null
或[void]$arraylist.Add($item)
来防止不必要的输出到管道。
谢谢。我现在就是这样做的。但这对我来说是不必要的冗长。以上是关于如何在 PowerShell 中将 HashSet 转换为 ArrayList?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PowerShell 中将 curl 结果作为变量获取
如何在 PowerShell 中将计算值写入 SQL INSERT/UPDATE