2016-09-03 1 views
5

Я хотел бы преобразовать массив Nullable(Of Byte)() (a.k.a. byte?[]) в массив, не содержащий NULL того же типа, то есть от byte?[] до byte[].Преобразование массива с нулевым типом в не-nullable того же типа?

Я ищу более простое, более простое, более быстрое универсальное решение на C# или VB.NET. Я нашел this общую функцию для преобразования между типами NULL, но я не могу найти способ адаптировать логику преобразования для преобразования от нулевого типа к типу с недействительным значением.

Это пример кода, для которого я чувствую необходимость выполнения такого рода преобразования:

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

'byte [] data2 = data.Where (x => x.HasValue) .Выберите (x => x.Value) .ToArray();' –

+0

Я не заметил подход LINQ, спасибо. – ElektroStudios

ответ

13

Чтобы преобразовать массив одного типа в массив другого типа, используйте метод Array.ConvertAll:

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

Это проще, легче и быстрее, чем с помощью LINQ.

1

Этот код будет возвращать массив, не являющихся nullables.

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

Что делать, если элемент пуст? –

5

Этот метод должен принять решение о том, как обращаться с нулевым значением. Для этого решения оно сопоставляется с default(byte) = 0, чтобы вход и выход имели одинаковую длину.

byte?[] data = {1, 0, 18, 22, 255, null}; 
var byteArray = data.Select(
       b => b ?? default(byte)).ToArray(); 
Смежные вопросы