Удалить незаполненные числа в массиве при выводе

Я бы хотел, чтобы последняя строка вывода

( 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 шт):

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

Я бы сделал просто так:

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.

→ Ссылка