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 шт):
С помощью обобщения - никак. Одномерный, двухмерный и зубчатый массивы - это логически разные структуры, и с ними надо работать по-разному. Обобщение предназначено только для отвязывания от конкретного типа тогда, когда логика обработки данных от изменения типа не меняется.
К примеру есть 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 не переписывая метод.