$Array.索引错误,索引 0 带有前缀逗号



我试图将变量的内容添加到数组中。不知道数组是否已初始化,我使用了在数据前面插入逗号的技巧,以强制它作为数组进行评估。似乎在执行此操作时,使用实际项目的前面逗号,indexof 方法不会为数组中的第一项提供正确的索引。

在下面的代码示例中,$a表现出问题,而$b工作正常;唯一的区别是初始化$a时前面的逗号。

这是一个错误,还是我错过了什么?

PS C:code> $a = (,4,5,6)
PS C:code> $b = (4,5,6)
PS C:code> $a
4
5
6
PS C:code> $a.indexof(4)
-1
PS C:code> $a.indexof(5)
1
PS C:code> $a.indexof(6)
2
PS C:code> $b
4
5
6
PS C:code> $b.indexof(4)
0
PS C:code> $b.indexof(5)
1
PS C:code> $b.indexof(6)
2

自从遇到这个问题以来,我只是用 [array] 作为我的变量前缀并去掉了前缀逗号,一切似乎都很好。我只是好奇发生了什么。

这里正在发生的几件事导致了误导性的结果。只要知道这种行为是意料之中的,

在第一个数组$a中,您创建了 3 个元素。首先是一元运算符。您实际所做的是创建一个三元素数组,其中第一个元素本身是一个元素的整数数组。PowerShell帮了你一个忙,展开了数组,这就是为什么$a$b的输出在控制台中看起来相同。

PS M:Scripts> $a = (,4,5,6)
PS M:Scripts> $a[0].GetType().Fullname
System.Object[]
PS M:Scripts> $a[1].GetType().Fullname
System.Int32

因此,.IndexOf()方法没有找到元素 4 的原因是因为它没有深入研究嵌套数组。

搜索指定的对象,并返回其在一维数组中首次出现的索引。

根据定义,它似乎不搜索嵌套数组。

如果需要考虑这一点,则可以使用 -is 运算符或仅检查类型。

PS M:Scripts> $a | %{$_ -is [array]}
True
False
False
PS M:Scripts> $a | %{$_.GetType().Fullname}
System.Object[]
System.Int32
System.Int32

关键是我在这里没有看到错误。只是PowerShell非常包容,以至于有点误导。

最新更新