Ваш массив не пустой - в нем 5 элементов, каждый из которых имеет нулевое значение.
Обратите внимание, что array
само по себе не равно нулю - и ни один не является query
.Но каждый элемент из них равен нулю.
A истинно пустой массив будет содержать 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
?Это работает для всей последовательности , а не для отдельных элементов.Идея не в том, чтобы заменить нулевые элементы значением по умолчанию;это для того, чтобы результат sequence никогда не был пустым.Если вы хотите выполнить простую «замену нуля новым значением», вы можете сделать:
Program[] query = array.Select(x => x ?? new Program())
.ToArray();
Обратите внимание, что это создаст новое значение Program
для каждого нулевого элемента;если вы хотите создать только один экземпляр Program
и использовать несколько ссылок на него, по одной для каждого первоначально нулевого элемента, вы можете сделать это:
Program defaultValue = new Program();
Program[] query = array.Select(x => x ?? defaultValue)
.ToArray();