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());
Другие вопросы по тегам