Array.Copy будет работать для вас, но только для замены самого внутреннего цикла.Вам нужно будет самостоятельно рассчитать исходные и конечные показатели, но это, безусловно, выполнимо.Документация для Array.Copy(Array, Int32, Array, Int32, Int32)
объясняет, как выполнять математику для индексов, чтобы вы могли указать исходное и целевое местоположение.
Я настоятельно рекомендую использовать Array.Copy везде, где имеет смысл его использоватьпотому что это безумно быстро.Они делают какой-то серьезный ассемблер, чтобы заставить его работать хорошо.
ОБНОВЛЕНИЕ
Я не уверен, насколько близко это исправить, потому что я не пробовал, но это что-то вроде того, как я думаю, что это может пойти:
int xLength = upper.X - lower.X + 1;
int yLength = upper.Y - lower.Y + 1;
int zLength = upper.Z - lower.Z + 1;
Array copy = Array.CreateInstance(Elements.GetType(), new { xLength, yLength, zLength }, new {lower.X, lower.Y, lower.Z});
int skippedX = lower.X - Elements.GetLowerBound(0);
int skippedY = lower.Y - Elements.GetLowerBound(1);
int skippedZ = lower.Z - Elements.GetLowerBound(2);
int sourceDim0Size = Elements.GetLength(1) * Elements.GetLength(2);
int sourceDim1Size = Elements.GetLength(2);
for (int x = 0; x < xLength; x++)
{
for (int y = 0; y < yLength; y++)
{
int destinationIndex = x * yLength * zLength + y * zLength;
int sourceIndex = (x + skippedX) * sourceDim0Size
+ (y + skippedY) * sourceDim1Size
+ skippedZ;
Array.Copy(Elements, sourceIndex, copy, 0, zLength);
}
}