逐行合并/合并两个列表?

时间:2017-04-28 13:23:11

标签: list powershell merge

我有两个存储在变量中的列表:$list1$list2,例如:

$list1

a
b
c
d

$list2

1
2
3
4

如何逐行将它们合并在一起,以便最终得到:

a1
b2
c3
d4

我尝试过使用数组(@),但它只是一个接一个地组合它们,而不是逐行组合,例如:

$list1 = @(command)
$list1 += @($list2)

3 个答案:

答案 0 :(得分:3)

如果您更喜欢流水线操作,也可以在一行中执行:

0 .. ($list1.count -1) | ForEach-Object { $list1[$_]+$list2[$_] }

答案 1 :(得分:2)

你可以使用<input type="text"/> <select style="width:20px;"> <option value=""></option> <option value="banana">Banana</option> <option value="apple">Apple</option> <option value="orange">Orange</option> </select>循环来执行此操作,该循环使用迭代遍历每个对象的索引,直到它达到第一个对象的总(For):

.count

输出:

$list1 = 'a','b','c','d'
$list2 = 1,2,3,4

For ($i=0; $i -lt $list1.count; $i++) {
    $list1[$i]+$list2[$i]
}

如果您希望结果转到变量,可以将a1 b2 c3 d4 放在$list =之前。

答案 2 :(得分:1)

补充Mark Wragg's helpful for-based answerMartin Brandl's helpful pipeline-based answer

foreach..结合起来,范围运算符可以提供一个性能良好的简洁解决方案:

foreach ($i in 0..($list1.count-1)) { "$($list1[$i])$($list2[$i])" }

即使首先构建了整个索引数组 - 0..($list1.count-1) - 这稍微优于具有大输入列表的for解决方案,foreachfor都将是明显快于基于管道的解决方案 - 见下文。

另请注意字符串插值(单个"..."字符串中的变量引用和子表达式)如何用于确保结果始终为字符串

相反,如果使用+,则LHS的类型决定输出类型,这可能导致错误或不需要的输出;例如,1 + 'a'会导致错误,因为1是一个整数,'a'无法转换为整数。

可选阅读:性能考虑

  • 通常,foreachfor解决方案明显快于基于管道(ForEach-Object cmdlet的)解决方案。

  • 管道优雅而简洁,但速度相对较慢。

    • 这不应该阻止您使用它们,但重要的是要知道它们可以成为性能瓶颈。

    • 管道内存效率,并且为了处理整个内存不适合的大型集合,它们始终是正确使用的工具。

  • PSv4引入了鲜为人知的.ForEach() 集合运算符(方法),其性能介于for / foreach之间ForEach-Object cmdlet

以下比较大型列表(100,000项)的相对性能;绝对时间数字会因许多因素而有所不同,但它们应该给你一般意义:

# Define two large lists.
$list1 = 1..100000
$list2 = 1..100000

# Define the commands as script blocks:
$cmds = { foreach ($i in 0..($list1.count-1))  { "$($list1[$i])$($list2[$i])" } },
        { for ($i=0; $i -lt $list1.count; $i++) { "$($list1[$i])$($list2[$i])" } },
        { 0..($list1.count -1) | ForEach-Object { "$($list1[$_])$($list2[$_])" } },
        {        (0..($list1.count-1)).ForEach({ "$($list1[$_])$($list2[$_])" }) }


# Time each command.
$cmds | ForEach-Object { '{0:0.0}' -f (Measure-Command $_).TotalSeconds }

在运行PSv5.1的双核Windows 10 VM中,我在多次运行测试后得到以下结果:

0.5  # foreach
0.7  # for
1.8  # ForEach-Object (pipeline)
1.2  # .ForEach() operator