c# Получение в функцию двумерного, одномерного или рваного массива

У меня создается один из видов массивов, и я хочу создать функцию, которая получает этот массив и выводит его в консоль. Возможно ли реализовать это без перегрузки, используя обобщения ?

switch (choice) 
            {
                case 1:
                    int[] arr1 = CratArr();
                    Print(arr1);
                    break;
                case 2:
                    int[,] arr2 = CreatDoubleArr();
                    Print(arr2);
                    break;
                case 3:
                    int[] arr3 = CreatRagArr();
                    Print(arr3);
                    break;
            }
private static void Print<T>(T a)
        {
            foreach (int el in a)
            {

            }
        }

Ответы (1 шт):

Автор решения: aepot

С помощью обобщения - никак. Одномерный, двухмерный и зубчатый массивы - это логически разные структуры, и с ними надо работать по-разному. Обобщение предназначено только для отвязывания от конкретного типа тогда, когда логика обработки данных от изменения типа не меняется.

К примеру есть 3 массива

int[] array = new[] { 1, 2, 3, 4 };
int[,] matrix = new[,] { { 1, 2 }, { 3, 4 } };
int[][] jaggedArray = { new[] { 1 }, new[] { 2, 3, 4 } };

Конечные элементы в этих массивах имеют тип int.

У всех массивов есть общий родительский класс - Array, и с помощью апкаста можно сделать так, чтобы метод, умеющий выводить на экран все 3 типа принимал их всех.

Тогда метод будет выглядеть так.

static void PrintArray(Array array)
{
    int index = 0;
    foreach (object item in array)
    {
        switch (item)
        {
            case int number:
                Console.Write(number);
                if ((index % array.GetLength(0)) == array.GetLength(0) - 1)
                    Console.WriteLine();
                else
                    Console.Write(" ");
                break;
            case int[] innerArray:
                Console.WriteLine(string.Join(" ", innerArray));
                break;
        }
        index++;
    }
}

Вот так можно проверить:

Console.WriteLine("Одномерный массив");
PrintArray(array);
Console.WriteLine("Двухмерный массив");
PrintArray(matrix);
Console.WriteLine("Зубчатый массив");
PrintArray(jaggedArray);

Вывод в консоль

Одномерный массив
1 2 3 4
Двухмерный массив
1 2
3 4
Зубчатый массив
1
2 3 4

А обобщение может пригодиться тогда, когда у вас не int, а какой-то любой тип.

Обобщенный метод выглядит так:

static void PrintArray<T>(Array array)
{
    int index = 0;
    foreach (object item in array)
    {
        switch (item)
        {
            case T elem:
                Console.Write(elem);
                if ((index % array.GetLength(0)) == array.GetLength(0) - 1)
                    Console.WriteLine();
                else
                    Console.Write(" ");
                break;
            case T[] innerArray:
                Console.WriteLine(string.Join(" ", innerArray));
                break;
        }
        index++;
    }
}

Вызывать правда его немного сложнее, нужно явно указывать тип данных для обобщения.

PrintArray<int>(array);

Но зато при желании можно поменять например int на double не переписывая метод.

→ Ссылка