【问题标题】:Powershell combine the elements of two arrays into one anotherPowershell 将两个数组的元素组合在一起
【发布时间】:2018-10-06 06:29:01
【问题描述】:

我想通过一个接一个地从每个数组中挑选元素来连接两个数组。并且没有将它们合并或简单地合并

我知道如何将第二个数组添加到第一个数组,如下所示:

$array1 = (0,4,8)
$array2 = (1,5,2)
$array1 += $array2
$array1

结果如下:

0
4
8
1
5
2

但是我怎样才能将它们复制到另一个给我这样的输出:

0
1
4
5
8
2

注意:我不想合并它们然后对列表进行排序。

元素需要保持相同的顺序。这将如何实现?

【问题讨论】:

  • 澄清一下;如果数组是:$array1 = (0,2,4)$array2 = (5,3,1),则预期结果是 0 5 2 3 4 1?
  • @iRon 是的,没错。

标签: arrays powershell


【解决方案1】:

虽然 Esperento57 为您提供了一个完美的工作解决方案,但这是我的想法,它也允许长度不同的数组。它使用System.Collections.ArrayList 来添加数组中的值,以便在您要组合大型数组时获得更好的性能。

$array1 = (0,2,4)
$array2 = (1,3,5,6,7,8)

$len1 = $array1.Length
$len2 = $array2.Length
$maxLength = [Math]::Max($len1, $len2)

$listResult = New-Object System.Collections.ArrayList
for ($i = 0; $i -lt $maxLength; $i++) {
    if ($i -lt $len1) { [void] $listResult.Add($array1[$i]) }
    if ($i -lt $len2) { [void] $listResult.Add($array2[$i]) }
}

$listResult.ToArray()

【讨论】:

  • 我相信这有一天会派上用场,谢谢。在我目前的情况下,这些数组相互关联并且长度始终相同。
【解决方案2】:

试试这样的

$array1 = (0,2,4)
$array2 = (1,3,5)

$MaxLen=[Math]::Max($array1.Length, $array2.Length)

$Result=@()

for ($i = 0; $i -lt $MaxLen; $i++)
{ 
    $Result+=$array1[$i]
    $Result+=$array2[$i]
}

$Result

【讨论】:

    【解决方案3】:

    这是另一种方法。 [咧嘴一笑]

    这个考虑了数组中不同的大小并将它们交错,直到一个数组用完项目。然后将较大数组中的剩余项添加到较小数组中,而不会添加“幽灵”项。

    $array1 = @(0,2,4)
    $array2 = @(5,7,9,11)
    
    $InterleavedArray = [System.Collections.Generic.List[int]]::new()
    
    $UpperBound = [math]::Max($array1.GetUpperBound(0), $array2.GetUpperBound(0))
    
    foreach ($Index in 0..$UpperBound)
        {
        if ($Index -le $array1.GetUpperBound(0))
            {
            $InterleavedArray.Add($array1[$Index])
            }
        if ($Index -le $array2.GetUpperBound(0))
            {
            $InterleavedArray.Add($array2[$Index])
            }
        }
    
    $InterleavedArray
    

    输出...

    0
    5
    2
    7
    4
    9
    11
    

    希望对你有帮助,

    【讨论】:

    • 通过将 [int] 更改为 [object] 这也适用于文本输入。谢谢。
    • @secondplace - 是的,类型几乎可以是任何东西。不用客气!很高兴有帮助! [grin] 保重,
    【解决方案4】:

    如果您希望元素保持相同的顺序,只需执行$array3 = $array1 + $array2。但是,如果您想对其进行排序,请执行$array3 = ($array1 + $array2) | sort

    【讨论】:

    • 排序不是我在第一篇文章中提到的选项,我知道该怎么做。我需要从每个数组中一个接一个地复制元素。
    • 请注意,您得到的是另一个数组中的两个数组。如果您组合了 2 个包含 2 个字符串的数组,并且您正在对新数组执行 foreach 并且您期望循环 4 个字符串,这可能会产生意想不到的结果。您将改为遍历 2 个对象。
    【解决方案5】:

    这是 Theos 答案的略微修改版本。 看起来更干净,速度更快:

    $array1 = (0,2,4)
    $array2 = (1,3,5,6,7,8)
    
    $len1 = $array1.Length
    $len2 = $array2.Length
    $maxIndex = [Math]::Max($len1, $len2)-1
    
    $arrayResult = @()
    $arrayResult = foreach ($i in 0..$maxIndex) {
        if ($i -lt $len1) { $array1[$i] }
        if ($i -lt $len2) { $array2[$i] }
    }
    $arrayResult
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 1970-01-01
      • 2020-01-27
      • 2021-04-27
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多