Удалить незаполненные числа в массиве при выводе
Я бы хотел, чтобы последняя строка вывода
( Console.WriteLine("Массив из положительных чисел: " + string.Join(" ", narray)); )
выглядела так: Массив из положительных чисел: 3 5 6 7 9 но она выглядит так: Массив из положительных чисел: 3 5 6 7 9 0 0 0 0
То есть, я бы хотел убрать из вывода нули, потому что это не очень красиво.
static void Main(string[] args)
{
int[,] array = new int[3, 3]
{
{-1,-2,3 },
{-4,5,6 },
{7,-8,9 }
};
int[] narray = new int[array.GetLength(0) * array.GetLength(1)];
Console.WriteLine("Массивный массив, с которым будем мы работать: ");
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
Console.Write(array[i, j] + "\t");
}
Console.WriteLine();
}
int x = 0;
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
if (array[i, j] > 0)
{
narray[x] = array[i, j];
x++;
}
}
}
Console.WriteLine("Массив из положительных чисел: " + string.Join(" ", narray));
}
Спасибо за Вашу помощь!
Ответы (1 шт):
Я бы сделал просто так:
Console.WriteLine(
"Массив из положительных чисел: " +
string.Join(" ", array.Cast<int>().Where(n => n > 0)));
Разоблачение магии: все массивы, даже многомерные, наследуются от типа System.Array, который реализует, среди прочего, нетипизированный IEnumerable. Реализация IEnumerable перечисляет все элементы массива в «плоском» виде (то есть в виде длинного одномерного списка). Чтобы перейти к типизированному IEnumerable<int>, можно применить Cast<int>, и отфильтровать нужные элементы при помощи Where. А для string.Join материализация не нужна, он будет вполне доволен, если на вход подать IEnumerable<int>.
Трюк с Cast не нужен для одномерных массивов, т. к. они дополнительно реализуют типизированный вариант IEnumerable.