はじめに
Null許容型の配列を通常の配列に変換する方法の備忘録です。
Null許容型の配列とは、基本的に普通の配列の中には「null」を挿入することができせんが、このnullも値の一つとしてみなし配列の値として扱うことができます。
int? a = null;
int b = 100;
int?[] nullableArr = new int?[] { a, b };
foreach(var item in nullableArr)
{
if(item == null)
{
Console.WriteLine("Target item is null");
}
else
{
Console.WriteLine($"Target item is {item}");
}
}
上記の通り、配列に「null」を設定しています。
結果は下記の通りです。
Target item is null
Target item is 100
int?[]の型宣言をint[] にすると、a=nullのためエラーとなります。
Null許容型配列を普通の配列に変換する
では、Null許容型の配列に対して、nullの場合はDefault値に置き換えて普通の配列にする方法です。
下記1行を用意してConvertAllにて変換します。
public static T[] Convert(T?[] array) where T : struct => Array.ConvertAll(array, t => t.GetValueOrDefault());
使い方は下記のような感じです。
static void Main(string[] args)
{
int? a = null;
int b = 100;
int?[] nullableArr = new int?[] { a, b };
Console.WriteLine(nullableArr.GetType());
var convertedArr = Array.ConvertAll((int?[])nullableArr, x => x ?? default(int));
Console.WriteLine(convertedArr.GetType());
foreach (var item in convertedArr)
{
Console.WriteLine($"Target item is {item}");
}
}
上記を実行した結果、想定通りNullable配列を普通の配列に変換されました。その際、nullには代わりに「0」を代入しています。(GetValueOrDefaultのintに対するデフォルト値は0)
System.Nullable`1[System.Int32][]
System.Int32[]
Target item is 0 //<--- nullが0に置き換わっています
Target item is 100
最後に
結構Nullableのまま利用していることの方が多いですが、nullチェックを省くなどできるだけ分岐点を増やさないコーディングにするのも保守性を考えると良いかと思います。