3

DefaultIfEmptyによってクエリされた後も配列がnullのままであるのはなぜですか?

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

2 に答える 2

5

配列は空ではありません。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();
于 2010-06-13T07:49:29.697 に答える
3

あなたがただ欲しいように聞こえます:

var query = Array.ConvertAll(array, item => item ?? new Program());
于 2010-06-13T07:55:51.063 に答える