2016-09-03 17 views
5

Tôi muốn chuyển đổi một mảng Nullable(Of Byte)() (a.k.a. byte?[]) thành một mảng không thể vô hiệu của cùng một loại, nghĩa là, từ byte?[] đến byte[].Chuyển đổi mảng từ kiểu có thể vô hiệu thành không thể vô hiệu hóa cùng loại?

Tôi đang tìm giải pháp chung đơn giản, dễ dàng hơn, nhanh hơn, trong C# hoặc VB.NET. Tôi đã tìm thấy this chức năng chung để chuyển đổi giữa các loại nullable nhưng tôi không thể tìm thấy một cách để thích ứng với logic chuyển đổi để chuyển đổi từ một loại nullable thành một loại không nullable.

Đây là một ví dụ mã mà tôi cảm thấy cần phải thực hiện loại mà chuyển đổi:

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

'byte [] dữ liệu2 = dữ liệu.Where (x => x.HasValue) .Chọn (x => x.Value) .ToArray();' –

+0

Tôi không lưu ý phương pháp LINQ, cảm ơn. – ElektroStudios

Trả lời

13

Để chuyển đổi một mảng của một loại đến một loạt các loại khác, sử dụng các phương pháp Array.ConvertAll:

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

Đây là đơn giản hơn, dễ dàng hơn và nhanh hơn so với sử dụng LINQ.

1

Mã này sẽ trả về một mảng của nullables phi.

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

Điều gì sẽ xảy ra nếu mục đó là rỗng? –

5

Phương pháp này phải đưa ra giả định về cách xử lý giá trị null. Đối với giải pháp này, nó được ánh xạ tới default(byte) = 0 để có đầu vào và đầu ra có cùng độ dài.

byte?[] data = {1, 0, 18, 22, 255, null}; 
var byteArray = data.Select(
       b => b ?? default(byte)).ToArray(); 
Các vấn đề liên quan