DefaultFempty не работает
-
27-09-2019 - |
Вопрос
Почему массив по-прежнему нулю после заправки по умолчанию?
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());