2010-08-11 28 views
1

如何是一个阵列Length属性标识,通过一个内部变量(即m_Length)或它的会枚举通阵列的所有项目。“asdf”.Length> 0与“asdf”.Any()?

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

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

(另请注意,Any是一个扩展方法,我想考虑到打电话内部get_Length与调用一个例方法的性能比较。

+0

shalooooooooooom chaver !!!!!!!!!!!!!!!!!!!! – 2010-11-16 02:28:15

+0

kachol lavan mamatzav gissaty :) – Shimmy 2010-11-16 02:43:45

回答

7

在你的代码的asdf变量不是一个数组,这是一个String。它只是恰巧,StringLength性能并实现IEnumerable<char>,它允许你打电话Any()

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

从技术上讲,使用Length会比调用Any()(因为已经创建数组枚举,然后调用MoveNext一次)更快,但这种差别可能是微不足道的。不过,检查Length变量更符合惯例。

3

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

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

相关问题