public static TResult[][] ToJaggedArray <TSource, TResult>(this TSource[,] twoDimensionalArray, Func <TSource, TResult> convertValue)
        {
            int rowsFirstIndex = twoDimensionalArray.GetLowerBound(0);
            int rowsLastIndex  = twoDimensionalArray.GetUpperBound(0);
            int numberOfRows   = rowsLastIndex + 1;

            int columnsFirstIndex = twoDimensionalArray.GetLowerBound(1);
            int columnsLastIndex  = twoDimensionalArray.GetUpperBound(1);
            int numberOfColumns   = columnsLastIndex + 1;

            TResult[][] jaggedArray = new TResult[numberOfRows][];
            for (int i = rowsFirstIndex; i <= rowsLastIndex; i++)
            {
                jaggedArray[i] = new TResult[numberOfColumns];

                for (int j = columnsFirstIndex; j <= columnsLastIndex; j++)
                {
                    jaggedArray[i][j] = convertValue(twoDimensionalArray[i, j]);
                }
            }
            return(jaggedArray);
        }