Pregunta

¿Por qué es nulo gama aún después de consultar por 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();
    }
}
¿Fue útil?

Solución

Su matriz no está vacía -. Que tiene 5 elementos, cada uno de los cuales tiene un valor nulo

Tenga en cuenta que en sí array no es null - y tampoco lo es query. Pero cada elemento de ellos es nula.

realmente array vacío tendrían 0 elementos:

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();
    }
}

Otra alternativa sería la de elementos nulos de filtro mientras se está copiando la matriz:

Program[] query = array.Where(x => x != null)
                       .DefaultIfEmpty(new Program())
                       .ToArray();

EDIT: Tal vez entendió mal el propósito de DefaultIfEmpty? Esto funciona en general secuencia , no sobre una base elemento individual. La idea no es reemplazar elementos nulos con un valor por defecto; que es para asegurarse de que el resultado secuencia nunca está vacío. Si usted quiere hacer un simple "reemplazar nula con un nuevo valor" que puede hacer:

Program[] query = array.Select(x => x ?? new Program())
                       .ToArray();

Tenga en cuenta que esto va a crear un nuevo valor de Program para cada elemento nulo; Si sólo desea crear una única instancia de Program y utilizar múltiples referencias a que, una para cada elemento inicialmente nula, usted puede hacer esto:

Program defaultValue = new Program();
Program[] query = array.Select(x => x ?? defaultValue)
                       .ToArray();

Otros consejos

Parece que lo que desea es:

var query = Array.ConvertAll(array, item => item ?? new Program());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top