web-dev-qa-db-ja.com

array.GetLength(0)とarray.GetUpperBound(0)の違い

これらの2つの方法の違いは何ですか?また、どちらを使用するのか

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

MSDNでは、GetLengthは要素の数を返すと述べていますが、GetUpperBoundは最大インデックスを決定しますが、配列は各インデックスの要素で初期化されるため、これはどのように異なるのでしょうか。

22
Cornelius

この(めったに使用されない)メソッドを見てください。 Docs から:

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

指定されたタイプと次元の長さの、指定された下限をもつ多次元配列を作成します。

これを使用すると、_-5 ... +5_からのインデックスを持つ配列を作成できます。この種の配列を使用したことがある場合、GetUpperBound()GetLength()-1よりもずっと便利になります。 GetLowerBound()も存在します。

ただし、この種類の配列に対するC#のサポートは低く、_[]_は使用できません。これらのメソッドは、Array.GetValue()およびSetValue()メソッドと組み合わせた場合にのみ必要になります。

39
Henk Holterman

_Array.Length_は、UpperBoundを取得するために配列から1を引く必要がある配列の長さ(要素数)を返します。

Array.GetUpperBound(0)は、配列の上限を返します。そのまま使用できます。

8
Abdul Rahman

GetUpperBoundは配列の最大インデックスを返し、GetLengthは配列の要素数を返します。

つまり、GetUpperBound = GetLength-1

2
George Duckett

これは古い質問だと思いますが、 GetUpperBound が指定されたディメンションの上限を返すことを強調する価値があると思います。この場合、2つの関数は同等ではないため、これは多次元配列にとって重要です。

// 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]);
}
1
Malice

一般的にはarray.GetUpperBound(0) = array.Length - 1ですが、ゼロ以外の下限を持つ配列を作成できるため、常に正しいとは限りません。

1
etlds

配列の下限が0の場合、混乱なくそれらのいずれかを使用できますが、array.length-1は広く使用されているため、お勧めします。ただし、配列の下限が0未満の場合は、array.GetUpperBound(0)を使用する必要があります。この場合、array.length-1!= array.getUpperBound(0)であるためです。

0
Asad Naqvi