DefaultIfEmpty no funciona
-
27-09-2019 - |
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();
}
}
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());