Powershell将两个数组的元素组合到一起

o0lyfsai  于 2023-03-18  发布在  Shell
关注(0)|答案(6)|浏览(296)

我想通过从每个数组中逐个选取元素来连接两个数组,而不是将它们组合或简单地合并
我知道如何将第二个数组添加到第一个数组,如下所示:

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

其结果如下:

0
4
8
1
5
2

但我如何将它们复制到另一个中,得到如下输出:

0
1
4
5
8
2

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

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

cnwbcb6i

cnwbcb6i1#

尽管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()
mspsb9vt

mspsb9vt2#

试试这样的东西

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

rur96b6h3#

这是另一种方法
这一个考虑到数组中不同的大小,并且交错排列它们,直到一个数组中的项目用完为止。然后添加较大数组中的剩余项目,而不添加较小数组中的“幽灵”项目。

$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

希望能有所帮助,
背风面

vshtjzan

vshtjzan4#

如果你想让元素保持相同的顺序,只需要执行$array3 = $array1 + $array2,如果你想对元素进行排序,可以执行$array3 = ($array1 + $array2) | sort

jpfvwuh4

jpfvwuh45#

下面是一个稍微修改过的版本,看起来更简洁,更快速:

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

dw1jzc5e6#

您可以:
1.将所有数组放在括号中,括号前有美元符号$()
1.用分号分隔所有数组;
示例:

$Array1 = @('a','b')
$Array2 = @('c','d')

$ConcatenatedArray = $($Array1; $Array2) #this is our special line

$ConcatenatedArray

输出:

a
b
c
d

我们可以验证它是一个以所有元素为单位的数组,而不是两个数组的数组,当你使用逗号作为分隔符时就会出现这种情况。

$Array1 = @('a','b')
$Array2 = @('c','d')

$ConcatenatedArray = $($Array1; $Array2)

$ConcatenatedArray.Count

输出:

4

相关问题