The code below translates a jagged array. For a jagged array A, the result is a n*m jagged array, where the outer size is n=max(A[i].Length) and the inner size of each subarray is m=A.GetLength(0).
Remark: Holes after null or incomplete subarrays will be filled with default(T).
Usage:
MyType[][] array = ...;
MyType[][] translated = array.Translate();
For examle:
-
array = new int[5][] {
new int[] { 5, 6, 7 },
new int [] { 1, 2, 3, 4 },
new int [] { },
new int [] { 0, 1 },
null,
};
expected = new int[4][] {
new int[] { 5, 1, 0, 0, 0 },
new int[] { 6, 2, 0, 1, 0 },
new int[] { 7, 3, 0, 0, 0 },
new int[] { 0, 4, 0, 0, 0 },
};
-
array = new int[2][] {
null,
null,
};
expected = new int[1][] {
new int[] { 0, 0 },
};
For nullable types, there would be null instead of 0.
public static class JaggedArrayExtensions
{
public static T[][] Translate<t>(this T[][] array)
{
if (array == null)
throw new ArgumentNullException();
if (array.Length == 0)
return new T[0][];
int columnCount = array.Max(sub => sub == null ? 1 : sub.Length);
int rowCount = array.Length;
T[][] res = new T[columnCount][];
for (int i = 0; i < columnCount; i++)
{
res[i] = new T[rowCount];
for (int j = 0; j < rowCount; j++)
{
if (array[j] == null || i >= array[j].Length)
res[i][j] = default(T);
else
res[i][j] = array[j][i];
}
}
return res;
}
}
My name is Jacek. Currently, I am a Java/kotlin developer. I like C# and Monthy Python's sense of humour.