将数组从可空类型转换为相同类型的不可空类型?

Convert array from nullable type to non-nullable of same type?

我想将 Nullable(Of Byte)() 数组 (a.k.a. byte?[]) 转换为相同类型的不可空数组,即从 byte?[]byte[].

我正在寻找 C# 或 VB.NET 中更简单、更容易、更快的通用解决方案。我发现 this 泛型函数可以在可为 null 的类型之间进行转换,但我找不到一种方法来调整转换逻辑以从可为 null 的类型转换为不可为 null 的类型。

这是一个代码示例,我觉得需要执行这种转换:

byte?[] data = {1, 0, 18, 22, 255};
string hex = BitConverter.ToString(data).Replace("-", ", ");

此代码将 return 一个不可为 null 的数组。

 Dim arr() As Nullable(Of Byte)
 dim nonNullableArray = arr.Select(Function(item) item.Value).ToArray()

此方法必须假设如何处理空值。对于此解决方案,它被映射到 default(byte) = 0 以使输入和输出具有相同的长度。

byte?[] data = {1, 0, 18, 22, 255, null};
var byteArray = data.Select(
                 b => b ?? default(byte)).ToArray();

要将一种类型的数组转换为另一种类型的数组,请使用 Array.ConvertAll 方法:

byte?[] data = { 1, 0, 18, 22, 255 };
byte[] result = Array.ConvertAll(data, x => x ?? 0);

这比使用 LINQ 更简单、更容易、更快。

我自己找到了这个寻找方法的线程。我最终使用 .OfType(...) 来过滤类型。

int?[] data = { 1, null, 18, 22, 255 };
var result = data.OfType<int>();
Console.WriteLine(string.Join(",", result)); // 1,18,22,255