.Length
and .Count
是彼此的别名,所谓内在成员PowerShell 添加的(属性)most objects,为了统一处理标量和集合(参见这个答案为背景)。
The 例外是 PowerShell 视为的类型的对象收藏品,即对象自动列举在管道中,其中包括类型的实例[System.Collections.ObjectModel.Collection[psobject]]
那.ForEach()数组法返回。
PowerShell 可以not add .Length
and .Count
属性到它所认为的集合的实例,因为它假设它们具有这样的属性他们自己,本地类型,假设已实现有效率的(而不是 PowerShell 必须执行枚举并对元素进行计数)。
这是一个合理的假设通常成立于.Count
, but rarely for .Length
(数组(System.Array)是一个值得注意的例子,其中.Length
存在并返回元素计数)。
Thus, 通常更好用.Count
而不是.Length
.
当您访问.Length
在 PowerShell 认为是集合的类型的实例上,但该类型没有此类类型本机属性,PowerShell 会执行成员访问枚举:
所以:
(1..3).ForEach({$_}).Length
实际上等同于:
(1..3).ForEach({ $_.Length })
上面解释了(1, 1, 1
) 输出。
相比之下,[System.Collections.ObjectModel.Collection[psobject]]
确实有一个类型本机 .Count
属性,它按预期返回元素的计数。
背景资料:
Note:
PowerShell 认为哪些 .NET 类型是集合(可枚举),因此会在管道中自动枚举:
-
Any 实现的类型 the IEnumerable / IEnumerable`1.NET 接口
-
Except以下是not自动枚举:
-
IDictionary / IDictionary`2,其中特别包括[hashtable]
(@{ ... }
,作为字面意思)及其有序表兄弟,OrderedDictionary ([ordered] @{ ... }
,作为字面意思)
-
XmlNode,基本类型为[xml]
(XmlDocument)
-
Strings (String);注意'foo'.Count
is 1
(反映字符串被认为是的内在属性scalar(单一事物)),而'foo'.Length
is 3
(返回字符计数的类型本机属性)。
-
此外, System.Data.DataTable (which itself不执行IEnumerable
,仅其.Rows
财产确实)。