/// <summary> /// Sets the elements of a jagged array given another jagged /// </summary> /// <param name="targetArray">The target array - also acts as a source</param> /// <param name="sourceArray">The source array</param> /// <param name="converter">Element converter</param> /// <returns></returns> public static void ConvertElements2( Array targetArray, Array sourceArray, ElementConverter2 converter) { int leafDepth = GetDepth(targetArray.GetType()); innerConvertElements2(0, leafDepth, targetArray, sourceArray, converter); }
private static void innerConvertElements2( int depth, int leafDepth, Array targetArray, Array sourceArray, ElementConverter2 converter) { bool atLeaf = (++depth == leafDepth); switch (targetArray.Rank) { case 1: if (atLeaf) { for (int i = 0; i < targetArray.Length; i++) { targetArray.SetValue(converter(targetArray.GetValue(i), sourceArray.GetValue(i)), i); } } else { Array[] ja1 = (Array[])targetArray; Array[] ja2 = (Array[])sourceArray; for (int i = 0; i < ja1.Length; i++) { innerConvertElements2(depth, leafDepth, ja1[i], ja2[i], converter); } } break; case 2: if (atLeaf) { for (int i = 0; i < targetArray.GetLength(0); i++) { for (int j = 0; j < targetArray.GetLength(1); j++) { targetArray.SetValue(converter(targetArray.GetValue(i, j), sourceArray.GetValue(i, j)), i, j); } } } else { Array[,] ja1 = (Array[, ])targetArray; Array[,] ja2 = (Array[, ])sourceArray; for (int i = 0; i < ja1.GetLength(0); i++) { for (int j = 0; j < ja1.GetLength(1); j++) { innerConvertElements2(depth, leafDepth, ja1[i, j], ja2[i, j], converter); } } } break; default: throw new ArgumentException("Multidimensional arrays of greater than rank 2 are not supported"); } }