web-dev-qa-db-fra.com

Différence entre array.GetLength (0) et array.GetUpperBound (0)

Quelle est la différence entre ces deux méthodes et quand utiliseriez-vous l’une au lieu de l’autre?

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

MSDN indique que GetLength renvoie le nombre d'éléments pour lesquels GetUpperBound détermine l'index maximal, mais en quoi cela pourrait-il être différent puisque les tableaux sont initialisés avec des éléments pour chaque index?

20
Cornelius

Jetez un oeil à cette méthode (rarement utilisée). De Docs

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

Crée un tableau multidimensionnel du type et des longueurs de cotes spécifiés, avec les limites inférieures spécifiées.

Avec cela, vous pouvez créer un tableau avec des index de -5 ... +5. Si vous utilisez ce type de tableau, alors GetUpperBound() devient soudainement beaucoup plus utile que GetLength()-1. Il existe également une GetLowerBound().

Mais le support C # pour ce type de tableaux est faible, vous ne pouvez pas utiliser []. Vous n’auriez besoin que de ces méthodes en combinaison avec les méthodes Array.GetValue () et SetValue (). 

36
Henk Holterman

Array.Length renvoie la longueur du tableau (nombre d'éléments) dont vous avez besoin pour soustraire 1 de celui-ci pour obtenir le UpperBound.

Array.GetUpperBound(0) renvoie la limite supérieure du tableau, vous pouvez l'utiliser tel quel.

7
Abdul Rahman

GetUpperBound renvoie l'index le plus élevé du tableau, la GetLength renvoie le nombre d'éléments du tableau.

c'est-à-dire GetUpperBound = GetLength - 1

2
George Duckett

Généralement, array.GetUpperBound(0) = array.Length - 1, mais étant donné que nous pouvons créer des tableaux qui ont une limite inférieure Non nulle, cela n’est pas toujours vrai.

1
etlds

Je réalise que c’est une vieille question, mais je pense qu’il est utile de souligner que GetUpperBound renvoie la limite supérieure de la dimension spécifiée. Ceci est important pour un tableau multidimensionnel car dans ce cas, les deux fonctions ne sont pas équivalentes.

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

La propriété Length affichera 8 car il y a 8 éléments dans le tableau.

Console.WriteLine(USHolidays.Length);

Cependant, la fonction GetUpperBound () affichera 3 car la limite supérieure de la première dimension est 3. En d'autres termes, je peux effectuer une boucle sur les indices de tableau 0, 1, 2 et 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]);
}
0
Malice

si la limite inférieure de votre tableau est 0, vous pouvez utiliser l'un ou l'autre sans aucune confusion, mais je recommanderais array.length-1, car il est largement utilisé. Toutefois, si la limite inférieure de votre tableau est inférieure à 0, vous devez utiliser array.GetUpperBound (0), car dans ce cas array.length-1! = array.getUpperBound (0).

0
Asad Naqvi