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

时间:2016-02-25 17:38:24

标签: powershell powershell-v3.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]前缀并删除了带前缀的逗号,一切似乎都很好。我只是好奇发生了什么。

1 个答案:

答案 0 :(得分:5)

这里发生的一些事情正在导致误导性的结果。只知道这种行为是预期的,

在您的第一个数组$a中,您创建了3个元素。第一个是unary operator。你实际做了什么是创建一个三元素数组,其中第一个元素本身是一个元素的整数数组。 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() method找不到元素4的原因是因为它没有深入研究嵌套数组。

  

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

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

如果您需要考虑到这一点,那么您可以使用-is运算符或只检查类型。

PS M:\Scripts> $a | %{$_ -is [array]}
True
False
False

PS M:\Scripts> $a | %{$_.GetType().Fullname}
System.Object[]
System.Int32
System.Int32

重点是我在这里看不到任何错误。只是PowerShell非常容易被误导。