【问题标题】:Convert array from nullable type to non-nullable of same type?将数组从可空类型转换为相同类型的不可空?
【发布时间】:2017-01-11 15:11:08
【问题描述】:

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

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

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

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

【问题讨论】:

  • byte[] data2 = data.Where(x => x.HasValue).Select(x => x.Value).ToArray();
  • 我没有注意到 LINQ 方法,谢谢。

标签: c# .net vb.net types nullable


【解决方案1】:

此代码将返回一个不可为空的数组。

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

【讨论】:

  • 如果项目为空怎么办?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我自己找到了这个寻找线索。我最终使用.OfType(...) 过滤类型。

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

      【讨论】:

        猜你喜欢
        • 2022-01-22
        • 1970-01-01
        • 2019-07-18
        • 1970-01-01
        • 2019-12-03
        • 2012-04-21
        • 1970-01-01
        • 2021-02-17
        • 1970-01-01
        相关资源
        最近更新 更多