Alors il s'avère que tous les tableaux ne sont pas créés égaux. Les tableaux multidimensionnels peuvent avoir des bornes inférieures non nulles. Voyez par exemple la propriété Range.Value de l'Excel PIA object[,] rectData = myRange.Value;
J'ai besoin de convertir ces données en un tableau échelonné. Mon premier essai ci-dessous sent la complexité. Des suggestions pour l'optimiser ? Il doit gérer le cas général où les bornes inférieures peuvent ne pas être zéro.
J'ai cette méthode ex :
public static T[][] AsJagged( this T[,] rect )
{
int row1 = rect.GetLowerBound(0);
int rowN = rect.GetUpperBound(0);
int col1 = rect.GetLowerBound(1);
int colN = rect.GetUpperBound(1);
int height = rowN - row1 + 1;
int width = colN - col1 + 1;
T[][] jagged = new T[height][];
int k = 0;
int l;
for ( int i = row1; i < row1 + height; i++ )
{
l = 0;
T[] temp = new T[width];
for ( int j = col1; j < col1 + width; j++ )
temp[l++] = rect[i, j];
jagged[k++] = temp;
}
return jagged;
}
Utilisé ainsi :
public void Foo()
{
int[,] iRect1 = { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } };
int[][] iJagged1 = iRect1.AsJagged();
int[] lengths = { 3, 5 };
int[] lowerBounds = { 7, 8 };
int[,] iRect2 = (int[,])Array.CreateInstance(typeof(int), lengths, lowerBounds);
int[][] iJagged2 = iRect2.AsJagged();
}
Curieux de savoir si Buffer.BlockCopy() fonctionnerait ou serait plus rapide ?
Édition : AsJagged doit gérer les types de référence.
Édition : Bug trouvé dans AsJagged(). Ajouté int l
; et ajouté col1 + width
à la boucle interne.