arrays - Powershell - 分别打印列表长度
问题描述
我想在 Powershell 中写两件事。例如; 我们有一个清单:
$a=@('ab','bc','cd','dc')
我想写:
1 >> ab
2 >> bc
3 >> cd
4 >> dc
我希望这是基于列表长度的动态。
感谢您的帮助。
解决方案
使用for
循环,以便您可以跟踪索引:
for( $i = 0; $i -lt $a.Count; $i++ ){
"$($i + 1) >> $($a[$i])"
}
解释这是如何工作的:
循环由
for
三个部分定义,由分号分隔;
。- 第一部分声明变量,在这种情况下我们定义
$i = 0
. 这将是我们的索引参考。 - 第二部分是循环继续的条件。只要
$i
小于,$a.Count
循环就会继续。我们不想超出列表的长度,否则您会遇到不良行为。 - 第三部分是循环的每次迭代结束时发生的事情。在这种情况下,我们希望
$i
每次将计数器增加 1($i++
是“递增$i
1”的简写) - 这种表示法的细微差别比我所包含的要多,但它与循环的工作方式无关。您可以在此处阅读有关一元运算符的更多信息。
- 第一部分声明变量,在这种情况下我们定义
对于循环体本身,我将解释字符串
您在循环中使用foreach
and的解决方案确实有效,但是 while可以获取当前索引,通过迭代数组直到找到匹配的对象引用,然后返回索引。对于大型数组,每次迭代将花费越来越长的时间。for 循环没有这个限制。$a.IndexOf($number)
$a.IndexOf($number)
.IndexOf(object)
考虑以下具有更大数组的示例:
# Array of numbers 1 through 65535
$a = 1..65535
# Use the for loop to output "Iteration INDEXVALUE"
# Runs in 106 ms on my system
Measure-Command { for( $i = 0; $i -lt $a.Count; $i++ ) { "Iteration $($a[$i])" } }
# Use a foreach loop to do the same but obtain the index with .IndexOf(object)
# Runs in 6720 ms on my system
Measure-Command { foreach( $i in $a ){ "Iteration $($a.IndexOf($i))" } }
另一件需要注意的事情是,虽然您可以更改集合元素的属性System.Concurrent.Collections
和执行方法,但在使用其枚举器时,您不能更改非集合集合(不在命名空间中的任何集合)的元素值。虽然不可见,但foreach
(并且相关地ForEach-Object
)隐式调用集合的.GetEnumerator()
循环方法。这不会像其他 .NET 语言那样引发错误,但 IMO 应该如此。它似乎会接受集合的新值,但一旦退出循环,该值将保持不变。
这并不是说永远不应该使用循环或者你做了任何“错误”的事情,但我觉得在你发现自己处于适合更好构造的情况foreach
之前应该知道这些细微差别。
推荐阅读
- python - 使用丢失的文件名引发异常
- python - 使用 Prefect 拆分任务
- java - UML 哪个箭头连接具体类和它的抽象类?
- reactjs - 如何在 gatsby 的特定页面中加载脚本
- c++ - 用 Switch 语句替换 if else
- c# - Asp.Net MVC Core - Post Action 将旧模型数据传递到不同的视图
- python - 是否可以在 Mongodb 中的动态字段上创建文本索引以进行文本查询搜索?
- sql - postgres sql提取年月
- rdf - RDF:是否可以在 Turtle 中将属性的范围设置为文字
- amazon-web-services - 使用 --color 参数时,AWS cli 无法列出 s3 内容