【问题标题】:How to convert a HashSet to an ArrayList in PowerShell?如何在 PowerShell 中将 HashSet 转换为 ArrayList?
【发布时间】: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 返回的数组也不支持它。

标签: arrays list powershell arraylist


【解决方案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 的强制转换确实隐式使用了构造函数。
  • @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) 来防止不必要的输出到管道。
    • 谢谢。我现在就是这样做的。但这对我来说是不必要的冗长。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2021-07-11
    • 1970-01-01
    • 2022-01-19
    • 2021-02-21
    • 1970-01-01
    相关资源
    最近更新 更多