配列は空ではありません。5つの要素があり、それぞれにnull値があります。
array
それ自体はnullではないことに注意してください-そしてどちらもnullではありませんquery
。しかし、それらの各要素はnullです。
真に空の配列には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();
}
}
もう1つの方法は、配列をコピーしているときにnull要素をフィルタリングすることです。
Program[] query = array.Where(x => x != null)
.DefaultIfEmpty(new Program())
.ToArray();
編集:おそらくあなたは目的を誤解しましたDefaultIfEmpty
か?これは、個々の要素ベースではなく、シーケンス全体で機能します。null要素をデフォルト値に置き換えるのではありません。結果シーケンスが空にならないようにする必要があります。単純な「nullを新しい値に置き換える」を実行する場合は、次のように実行できます。
Program[] query = array.Select(x => x ?? new Program())
.ToArray();
Program
これにより、null要素ごとにの新しい値が作成されることに注意してください。の単一のインスタンスのみを作成し、Program
それへの複数の参照を使用する場合は、元々null要素ごとに1つずつ、次のように実行できます。
Program defaultValue = new Program();
Program[] query = array.Select(x => x ?? defaultValue)
.ToArray();