“asdf”.Length> 0对阵“asdf”.Any()?

时间:2010-08-11 02:56:35

标签: .net arrays extension-methods performance

如何通过内部变量(即m_Length)识别数组Length属性,或者它将通过数组的所有项目进行枚举。

如果我想检查数组是否包含任何元素,则会发生差异。

Dim asdf = { "a"c, "s"c, "d"c, "f"c }
Dim any = asdf.Any()
Dim any2 = asdf.Length > 0

(另请注意,Any是一种扩展方法,我想考虑调用内部get_Length与调用ex。方法的性能比较。

2 个答案:

答案 0 :(得分:7)

代码中的asdf变量不是数组,而是String。恰好String具有Length属性并实现了IEnumerable<char>,这使您可以调用Any()

尽管如此,要回答您的实际问题,确定数组的长度不需要枚举;长度存储为数组的一部分。

从技术上讲,使用Length会比调用Any()更快(因为必须为数组创建一个枚举器,然后调用MoveNext一次),尽管差异可能微不足道。但是,检查Length变量更符合约定。

答案 1 :(得分:3)

array.Length是属性和O(1)操作。数组的长度在创建时是已知的,因此在访问Length属性时没有理由枚举整个数组。 Any()应该相当快,如果集合类型可以更改为任何其他IEnumerable<T>,则肯定有用,但长度不会是性能拖累。

此外,您的具体示例使用字符串而不是数组,但消息是相同的。字符串的长度在创建时是已知的,因此当您访问该属性时,Length不需要枚举字符串中的字符。