private static void Convert2Dto1D <T>(T[,] sourceArr, out T[] targetArr, ArrayDirection direction)
        {
            int len0     = sourceArr.GetLength(0);
            int len1     = sourceArr.GetLength(1);
            int totalLen = len0 * len1;

            targetArr = new T[totalLen];
            int idx = 0;

            if (direction == ArrayDirection.Horizontal)
            {
                for (int y = 0; y < len1; y++)
                {
                    for (int x = 0; x < len0; x++)
                    {
                        targetArr[idx++] = sourceArr[x, y];
                    }
                }
            }
            else
            {
                for (int x = 0; x < len0; x++)
                {
                    for (int y = 0; y < len1; y++)
                    {
                        targetArr[idx++] = sourceArr[x, y];
                    }
                }
            }
        }
        private static void Convert1Dto2D <T>(T[] sourceArr, int xLen, int yLen, out T[,] targetArr, ArrayDirection direction)
        {
            targetArr = new T[xLen, yLen];
            int curIdx = 0;

            if (direction == ArrayDirection.Horizontal)
            {
                for (int y = 0; y < yLen; y++)
                {
                    for (int x = 0; x < xLen; x++)
                    {
                        targetArr[x, y] = sourceArr[curIdx++];
                    }
                }
            }
            else
            {
                for (int x = 0; x < xLen; x++)
                {
                    for (int y = 0; y < yLen; y++)
                    {
                        targetArr[x, y] = sourceArr[curIdx++];
                    }
                }
            }
        }