【问题标题】:.NET array - difference between "Length", "Count()" and "Rank".NET 数组 - “Length”、“Count()”和“Rank”之间的区别
【发布时间】:2011-10-02 13:14:58
【问题描述】:

.NET 数组的“Length”、“Count()”和“Rank”有什么区别?

【问题讨论】:

    标签: c# .net arrays


    【解决方案1】:

    Length 是数组对象的属性,使用它是确定数组中元素计数的最有效方法 (Array.Length in MSDN documentation)。

    Count() 是一个LINQ 扩展方法,其效果相同。它适用于数组,因为数组是可枚举的对象。最好使用Length,因为Count() 可能更贵(更多讨论请参阅this question,参考MSDN documentation on Count)。

    Rank 是返回维数的属性(完全不同)。当你声明一个数组int[,] myArray = new int[5,10]; 时,它的Rank 将是2,但它总共会包含50 个元素(MSDN on Rank property)。

    【讨论】:

    • “Length”和“Count()”有什么区别,而不是“Count()”是LINQ扩展方法吗?
    • @Alex Maslakov:数组类型本身没有 Count() 方法 afaik
    • @Alex,Length 属于 Array 类,Count 是所有 Enumerable 类型的扩展方法。我猜 Array.Length 比 Count() 快。但是,使用 Count() 您可以使用谓词来计算满足条件的项目数。
    • 存在额外的间接层级,但对于数组,Count() 不会枚举数组:数组实现 ICollection,因此 Count 属性将由 count 扩展方法最终调用, 和 Length 一样。
    • @BertrandLeRoy:这是正确的,但是,在通常情况下,Count() 调用可能更昂贵(即使在某些情况下它同样便宜),这正是我写的,还是我错过了什么?
    【解决方案2】:
    • Length: 数组中的元素总数
    • LongLength:与Length 相同,但返回为long(如果 >= 231
    • Count():LINQ 扩展方法也适用于其他集合类型
    • Rank:数组中维度的数量(对于向量,总是1)。仅在 .NET 3.5+ 中。
    • GetLength()GetLongLength():数组的某个维度长度
    • GetLowerBound():数组某个维度的起始索引;总是0 用于向量
    • GetUpperBound():数组某个维度的结束索引;总是Length - 1 用于向量

    有趣的是,没有GetLongUpperBound()GetLongLowerBound()...


    现在我们谈到了这个话题,.NET 中的 arrayvector 有什么区别?

    数组与向量

    向量是您在 C# 中通常所说的“一维”数组。但是,一维数组实际上不是int[] 之类的类型,而是int[*] 类型。 C# 不直接支持它们;但是,它们可以使用Array.CreateInstance 创建,并且可以具有非零下限。但是,它们比向量稍慢,因为 CLR 直接支持向量。因为一维数组实际上很少使用,C# 决定不支持它们(尽管它可以通过使用 var 关键字来使用它们,来自另一个声明它们的模块!)。

    【讨论】:

      【解决方案3】:
      • Length 是返回 Array 中元素数量的属性。
      • Count() 是一个 LINQ 扩展,在 IEnumerable 上做同样的事情。可选地,它可以将谓词作为参数,并返回满足它的元素的数量。
      • Rank 是一个属性,返回 Array 中的维数。

      【讨论】:

        【解决方案4】:

        .Count() 适用于 IEnumerableListArrayList 类型。而Length 代表Array

        Rank 表示数组的维数

        【讨论】:

        • 字典呢? (计数)
        【解决方案5】:

        LengthArray 自 C# 1.x 以来的属性

        Count()IEnumerable<T>的扩展方法,因为现在每个T[]都隐式实现了IEnumerable<T>

        注意,对于数组,Count() 通常比Length 慢得多, 因为访问Length 属性是O(1),而Count 是针对IEnumerable<T>,所以程序需要遍历集合并得到它的计数,即O(n)。

        Rank 给出了数组的维度。

        【讨论】:

        • 不是much slower 因为Count() 方法的实现有一些专门针对这种情况的内置优化。另外,stackoverflow.com/questions/981254/…
        • @Dyppl:嗯,much slower 没有基于精确的标准。它花费 10 倍的时间,所以我说“慢得多”。但事实是,10x 时间不到 0.1 秒。
        • 但我不知道这种情况下的“10x”。它可能需要再进行一次强制转换操作,与涉及迭代所有 N 个元素的 非常慢 实现相比,这基本上算不了什么。
        • @Dyppl:我用Stopwatch 进行了测试。 Count() 包含 10000 个项目的数组需要 10 倍的时间。
        • 这个答案应该更新:Count() 将枚举数组是不正确的:对于任何实现 ICollection 的东西都有优化。
        【解决方案6】:

        Length 是数组的大小。
        Count() 是数组中项目的数量(来自 system.linq
        Rank 返回维数(a[][] = 2, a[] = 1)。

        【讨论】:

        • 其实T[][]类型的数组的秩是1。它是一个一维数组,其元素是一维数组。 rank为2的类型是T[,]
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 2021-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多