.net array - difference between “Length”, “Count()” and “Rank”
.NET数组的"length"、"count()"和"rank"有什么区别?
Length是数组对象的属性,使用它是确定数组中元素计数的最有效方法(array.length在msdn文档中)
Count()是一种LINQ扩展方法,它的作用是相同的。它应用于数组,因为数组是可枚举的对象。最好使用Length,因为Count()可能会更贵(请参阅本问题进一步讨论和有关count的msdn文档以供参考)
Rank是返回维度数的属性(完全不同)。当您声明一个数组int[,] myArray = new int[5,10];时,它的Rank将是2,但它将总共包含50个元素(秩属性上的msdn)。
编辑:感谢Kornelije Petak提供相关的msdn链接。
- "length"和"count()"而不是"count()"是linq扩展方法吗?
- @alex maslakov:数组类型本身没有Count()方法afaik
- @alex,length属于array类,count是所有可枚举类型的扩展方法。我猜数组的长度比count()快。但是,使用count()可以使用谓词来计算满足条件的项数。
- 有额外的间接级别,但对于数组,count()不会枚举数组:数组实现ICollection,因此count属性最终将由count扩展方法调用,其长度相同。
- @Bertrandleroy:这是正确的,但是,在通常情况下,Count()呼叫可能会更昂贵(即使在某些情况下,它同样便宜),这正是我写的,还是我遗漏了什么?
- 我只是在添加一些信息,而不是攻击你的答案。
- @伯特兰德利:没问题,这确实是有用的信息
- @DYPPL:你的答案是忽略了这样一个事实:你也可以直接调用ICollection Count属性,通过var count = ((ICollection)myArray).Count;,当然,如果数组首先作为集合传递,那么它只是直接使用它,作为var count = col.Count;。
- Length:数组中元素的总数。
- LongLength:同Length,返回long(当大于231时)
- Count():与其他集合类型一起使用的LINQ扩展方法。
- Rank:数组中的维数(对于向量,总是1)。仅在.NET 3.5+中。
- GetLength()、GetLongLength():数组某维的长度。
- GetLowerBound():数组某维的起始索引;矢量总是0。
- GetUpperBound():数组某维的结束索引;矢量总是Length - 1。
有趣的是,没有GetLongUpperBound()或GetLongLowerBound()的…
既然我们讨论了这个主题,那么数组和向量在.NET中的区别是什么?
阵列与矢量
向量是C_中通常称为"1d"的数组。但是,一维数组实际上不是像int[]那样的类型,而是int[*]类型。C不直接支持它们;但是,它们可以用Array.CreateInstance创建,并且可以有非零的下限。但是,它们比向量稍慢,因为向量直接支持在CLR中。因为实际上很少使用一维数组,C决定不支持它们(尽管它可以通过使用var关键字从声明它们的另一个模块使用它们!).
- Length是返回Array中元素数目的属性。
- Count()是一个linq扩展,它在IEnumerable上做同样的扩展。或者,它可以使用谓词作为参数,并返回满足该参数的元素数。
- Rank是返回Array中维度数的属性。
Length是Array的财产,因为c 1.x
Count()是IEnumerable的一种扩展方法,因为现在每个T[]都隐式地实现IEnumerable。
注意,对于一个数组,Count()通常比Length慢得多,因为访问Length属性是o(1),而Count属性是IEnumerable属性,所以程序需要通过集合得到它的计数,即o(n)。
Rank给出了阵列的尺寸。
- 不是much slower,因为Count()方法的实现有一些内置的优化。另外,stackoverflow.com/questions/981254/…
- @Dyppl:嗯,much slower并没有建立在一个精确的标准上。它花费10倍的时间,所以我说"慢得多"。但事实是,10倍的时间小于0.1秒。
- 但我不知道这种情况下的"10倍"。它可能还需要一个CAST操作,与涉及所有n个元素的迭代的真正缓慢的实现相比,基本上没有什么。
- @Dyppl:我用Stopwatch测试过。对于一个包含10000个项目的数组,Count()的开销是10倍。
- 好吧,好吧,但重点是它不是更复杂的副作用
- +1个有意义的答案
- 应该更新此答案:count()将枚举数组不是真的:其中对实现ICollection的任何内容都进行了优化。
.Count()井为IEnumerable型、List型或ArrayList型。而Length是Array的。
Rank表示数组的维数。
length是数组的大小count()是数组中的项数(从System.Linq)rank返回维数(a[][]=2,a[]=1)
- 实际上,T[][]类型数组的秩为1。它是一个一维数组,其元素是一维数组。等级为2的类型是T[,]。