Вопрос

Почему массив по-прежнему нулю после заправки по умолчанию?

class Program
{
    static void Main(string[] args)
    {
        Program[] array = new Program[5];
        Program[] query = array.DefaultIfEmpty(new Program()).ToArray();
        foreach (var item in query)
        {
            Console.WriteLine(item.ToString());
        }
        Console.ReadKey();
    }
}
Это было полезно?

Решение

Ваш массив не пуст - он получил 5 элементов, каждый из которых имеет нулевое значение.

Обратите внимание, что array сам нет null - и не query. Отказ Но каждый элемент из них ноль.

А. действительно Пустой массив будет иметь 0 элементов:

using System;
using System.Linq;

class Program
{

    static void Main(string[] args)
    {
        Program[] array = new Program[0];
        Program[] query = array.DefaultIfEmpty(new Program()).ToArray();
        foreach (var item in query)
        {
            Console.WriteLine(item.ToString());
        }
        Console.ReadKey();
    }
}

Еще одна альтернатива будет фильтровать нулевые элементы, когда вы копируете массив:

Program[] query = array.Where(x => x != null)
                       .DefaultIfEmpty(new Program())
                       .ToArray();

Редактировать: Возможно, вы неправильно поняли цель DefaultIfEmpty? Это работает в целом последовательность, не на индивидуальном элементе. Идея не заменяет нулевые элементы с помощью значения по умолчанию; Это чтобы убедиться, что результат последовательность никогда не пусто. Если вы хотите сделать простой «заменить нулю с новым значением», вы можете сделать:

Program[] query = array.Select(x => x ?? new Program())
                       .ToArray();

Обратите внимание, что это создаст новое значение Program для каждого нулевого элемента; Если вы хотите только создать один экземпляр Program И используйте несколько ссылок на это, один для каждого изначально нулевого элемента, вы можете сделать это:

Program defaultValue = new Program();
Program[] query = array.Select(x => x ?? defaultValue)
                       .ToArray();

Другие советы

Похоже, вы просто хотите:

var query = Array.ConvertAll(array, item => item ?? new Program());
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top