DefaultIfEmpty не работает - PullRequest
3 голосов
/ 13 июня 2010

Почему массив по-прежнему равен нулю после запроса 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 голосов
/ 13 июня 2010

Ваш массив не пустой - в нем 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();
3 голосов
/ 13 июня 2010

Звучит так, как будто вы просто хотите:

var query = Array.ConvertAll(array, item => item ?? new Program());
...