【问题标题】:Difference between array.GetLength(0) and array.GetUpperBound(0)array.GetLength(0) 和 array.GetUpperBound(0) 之间的区别
【发布时间】:2011-11-04 09:00:34
【问题描述】:

这两种方法有什么区别,什么时候用其中一种代替另一种?

int[,] array = new int[4,3];
int length0 = array.GetLength(0);
int upperbound0 = array.GetUpperBound(0);

MSDN 说 GetLength 返回元素的数量,因为 GetUpperBound 确定最大索引,但是这有什么不同,因为数组是用每个索引的元素初始化的?

【问题讨论】:

  • 您假设下限始终为零。不是。

标签: c# arrays multidimensional-array


【解决方案1】:

看看这个(很少使用的)方法。来自Docs

public static Array CreateInstance(Type elementType, int[] lengths, int[] lowerBounds)

使用指定的下限创建指定类型和维度长度的多维数组。

有了它,您可以创建一个索引来自-5 ... +5 的数组。如果你曾经使用过这种数组,那么GetUpperBound() 会突然变得比GetLength()-1 有用得多。还有一个GetLowerBound()

但是C#对这种数组的支持很低,你不能使用[]。您只需将这些方法与 Array.GetValue() 和 SetValue() 方法结合使用。

【讨论】:

  • “但请不要那样做。”。如果您确定数组的边界,为什么不呢?
  • 我只会在我确定边界时使用它。
【解决方案2】:

Array.Length 返回你需要的数组长度(元素个数) 从中减去 1 得到 UpperBound。

Array.GetUpperBound(0)返回数组的上界,可以使用 照原样。

【讨论】:

    【解决方案3】:

    GetUpperBound返回数组中的最高索引,GetLength返回数组元素个数。

    即GetUpperBound = GetLength - 1

    【讨论】:

    • 通常。但这不是提供它的原因。
    • +1 对你的回答,不知道你可以在 0 以外的索引处开始一个数组!
    【解决方案4】:

    我意识到这是一个老问题,但我认为值得强调的是 GetUpperBound 返回指定维度的上边界。这对于多维数组很重要,因为在这种情况下,这两个函数是不等价的。

    // Given a simple two dimensional array
    private static readonly int[,] USHolidays =
    {
        { 1, 1 },
        { 7, 4 },
        { 12, 24 },
        { 12, 25 }
    };
    

    由于数组中有 8 个元素,因此 Length 属性将输出 8。

    Console.WriteLine(USHolidays.Length);
    

    但是,GetUpperBound() 函数将输出 3,因为第一个维度的上边界是 3。换句话说,我可以遍历数组索引 0、1、2 和 3。

    Console.WriteLine(USHolidays.GetUpperBound(0));
    for (var i = 0; i <= USHolidays.GetUpperBound(0); i++)
    {
        Console.WriteLine("{0}, {1}", USHolidays[i, 0], USHolidays[i, 1]);
    }
    

    【讨论】:

      【解决方案5】:

      一般情况下,array.GetUpperBound(0) = array.Length - 1,但由于我们可以创建具有非零下限的数组,因此并非总是如此。

      【讨论】:

        【解决方案6】:

        如果您的数组的下限为 0,那么您可以使用其中任何一个而不会造成任何混淆,但我建议使用 array.length-1,因为它被广泛使用。但是,如果数组的下限小于 0,那么您应该使用 array.GetUpperBound(0) 因为在这种情况下 array.length-1 != array.getUpperBound(0)

        【讨论】:

          猜你喜欢
          • 2016-01-08
          • 2014-10-09
          • 1970-01-01
          • 1970-01-01
          • 2012-10-23
          • 1970-01-01
          • 2011-01-02
          • 2023-03-15
          • 2018-12-15
          相关资源
          最近更新 更多