Translating a jagged array
-
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: 1.
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
{
/// <summary>
/// Translates a given jagged array. Holes after null or incomplete subarrays will be fileld with default(T).
/// </summary>
/// <typeparam name="T">Type of elements in the array</typeparam>
/// <param name="array">The array to translate</param>
/// <returns>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).</returns>
public static T[][] Translate(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;
}
}Greetings - Jacek
-
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: 1.
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
{
/// <summary>
/// Translates a given jagged array. Holes after null or incomplete subarrays will be fileld with default(T).
/// </summary>
/// <typeparam name="T">Type of elements in the array</typeparam>
/// <param name="array">The array to translate</param>
/// <returns>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).</returns>
public static T[][] Translate(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;
}
}Greetings - Jacek
Put this in as a Tip/Trick
Panic, Chaos, Destruction. My work here is done. Drink. Get drunk. Fall over - P O'H OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
-
Put this in as a Tip/Trick
Panic, Chaos, Destruction. My work here is done. Drink. Get drunk. Fall over - P O'H OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
-
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: 1.
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
{
/// <summary>
/// Translates a given jagged array. Holes after null or incomplete subarrays will be fileld with default(T).
/// </summary>
/// <typeparam name="T">Type of elements in the array</typeparam>
/// <param name="array">The array to translate</param>
/// <returns>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).</returns>
public static T[][] Translate(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;
}
}Greetings - Jacek
-
You don't need GetLength(0), because the array is not multidimensional but jagged, so the outer array is "just any old 1D array".
-
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: 1.
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
{
/// <summary>
/// Translates a given jagged array. Holes after null or incomplete subarrays will be fileld with default(T).
/// </summary>
/// <typeparam name="T">Type of elements in the array</typeparam>
/// <param name="array">The array to translate</param>
/// <returns>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).</returns>
public static T[][] Translate(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;
}
}Greetings - Jacek
How about this one?
public static T[][] Translate2<T>(this T[][] array)
{
if (array == null)
throw new ArgumentNullException();
if (array.Length == 0)
return new T[0][];return Enumerable.Range(0, array.Max(sub => sub == null ? 1 : sub.Length)). Select(i => Enumerable.Range(0, array.Length). Select(j => array\[j\] == null || i >= array\[j\].Length ? default(T) : array\[j\]\[i\]).ToArray()).ToArray();
}
Robert
-
How about this one?
public static T[][] Translate2<T>(this T[][] array)
{
if (array == null)
throw new ArgumentNullException();
if (array.Length == 0)
return new T[0][];return Enumerable.Range(0, array.Max(sub => sub == null ? 1 : sub.Length)). Select(i => Enumerable.Range(0, array.Length). Select(j => array\[j\] == null || i >= array\[j\].Length ? default(T) : array\[j\]\[i\]).ToArray()).ToArray();
}
Robert
-
No offense, but I would file that under "LINQ where it doesn't help and only slows things down"
I know but its so much fun... :-D
-
No offense, but I would file that under "LINQ where it doesn't help and only slows things down"
Without data, who knows? If it were done .AsParallel it may be faster on certain system/jagged array combos. Then again, if you find yourself translating jagged arrays on large sets of data, it may be a sign of choosing the wrong data structure.