using System.Collections.Generic;
using CsharpExtras.Extensions;
public static void Main()
string[,] sourceArray = new string[,]{{"Guidewire", "Is", "Great"}, {"Adapt", "And", "Succeed"}};
string[,] arr1 = new string[,]{{"a111", "a112", "a113", "a114"}, {"a121", "a122", "a123", "a124"}};
string[,] arr2 = new string[,]{{"a21"}, {"a22"}};
string[,] arr3 = new string[3,0];
string defaultValue = "xCenter";
var result = sourceArray.JoinRows(new List<string[,]>{arr1, arr2, arr3}, defaultValue);
string[,] expected = new string[,]{
{"Guidewire", "Is", "Great", "xCenter"},
{"Adapt", "And", "Succeed", "xCenter"},
{"a111", "a112", "a113", "a114"},
{"a121", "a122", "a123", "a124"},
{"a21", "xCenter", "xCenter", "xCenter"},
{"a22", "xCenter", "xCenter", "xCenter"},
{"xCenter", "xCenter", "xCenter", "xCenter"},
{"xCenter", "xCenter", "xCenter", "xCenter"},
{"xCenter", "xCenter", "xCenter", "xCenter"}
var comparison = result.Compare(expected, string.Equals);
Console.WriteLine(comparison.Message);
Console.WriteLine("\nActual: ");
Console.WriteLine("\nExpected: ");
private static void PrintArray(string[,] arr)
for (int i = 0; i < arr.GetLength(0); i++)
for (int k = 0; k < arr.GetLength(1); k++ )
Console.Write(arr[i,k] + new string(' ', 10 - arr[i,k].Length));
public static class ArrayExtension2
public static TVal[,] JoinRows<TVal>(this TVal[,] arr, IEnumerable<TVal[,]> others, TVal defaultValue)
var array = others.Prepend(arr);
var columns = array.Select(item => item.GetLength(1)).Max();
var rows = array.Select(item => item.GetLength(0)).Sum();
var arrayCount = array.Count();
TVal[,] result = new TVal[rows, columns];
for(int e = 0, tempIndex = 0; e < arrayCount; e++) {
var tempElem = array.ElementAt(e);
int tempLenght = tempElem.GetLength(1);
for(int i = 0; i < tempElem.GetLength(0); i++, tempIndex++) {
for(int j = 0; j < columns; j++) {
result[tempIndex, j] = j >= tempLenght ? defaultValue : (TVal) tempElem.GetValue(i,j);