Итак оказывается , что все массивы не созданы равными. Многомерные массивы могут иметь ненулевые нижние границы. См., Например, свойство Range.Value Excel PIA , объект [,] rectData = myRange.Value;
Мне нужно преобразовать эти данные в массив с зубцами. Моя первая попытка ниже пахнет сложностью. Есть предложения по его оптимизации? Он должен обрабатывать общий случай, когда нижняя граница может отличаться от нуля.
У меня есть этот 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;
}
Используется так:
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();
}
Любопытно, будет ли Buffer.BlockCopy () работать или быть быстрее?
Изменить: AsJagged необходимо обрабатывать ссылочные типы.
Edit: обнаружена ошибка в AsJagged (). Добавлен int l
; и добавил во внутренний цикл col1 + width
.