我有两个存储在变量中的列表:$list1
和$list2
,例如:
$list1
:
a b c d
$list2
:
1 2 3 4
如何逐行将它们合并在一起,以便最终得到:
a1 b2 c3 d4
我尝试过使用数组(@),但它只是一个接一个地组合它们,而不是逐行组合,例如:
$list1 = @(command)
$list1 += @($list2)
答案 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 answer和Martin Brandl's helpful pipeline-based answer:
将foreach
与..
结合起来,范围运算符可以提供一个性能良好的简洁解决方案:
foreach ($i in 0..($list1.count-1)) { "$($list1[$i])$($list2[$i])" }
即使首先构建了整个索引数组 - 0..($list1.count-1)
- 这稍微优于具有大输入列表的for
解决方案,foreach
和for
都将是明显快于基于管道的解决方案 - 见下文。
另请注意字符串插值(单个"..."
字符串中的变量引用和子表达式)如何用于确保结果始终为字符串。
相反,如果使用+
,则LHS的类型决定输出类型,这可能导致错误或不需要的输出;例如,1 + 'a'
会导致错误,因为1
是一个整数,'a'
无法转换为整数。
通常,foreach
和for
解决方案明显快于基于管道(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