DefaultIfEmpty не работает
Почему массив по-прежнему нулевой после запроса DefaultIfEmpty?
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();
}
}
2 ответа
Ваш массив не пустой - в нем 5 элементов, каждый из которых имеет нулевое значение.
Обратите внимание, что array
сам по себе не является нулевым - и не является 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());