Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Nullable数组复制到相同基类型的非Nullable数组的有效方法?_C#_Arrays_Nullable - Fatal编程技术网

C# 将Nullable数组复制到相同基类型的非Nullable数组的有效方法?

C# 将Nullable数组复制到相同基类型的非Nullable数组的有效方法?,c#,arrays,nullable,C#,Arrays,Nullable,假设源数组保证没有任何空值(如果有,可以抛出异常),是否有一种有效的方法将空值数组(例如byte?[])复制到非空值数组(例如byte[])中?显然,我可以循环索引并单独复制每个元素 这是行不通的。它进行编译,但在运行时抛出一个ArrayTypeMismatchException byte?[] sourceNullable = new byte?[]{1,2,3}; byte[] destNonNullable = new byte[3]; Array.Copy(sourceNulla

假设源数组保证没有任何空值(如果有,可以抛出异常),是否有一种有效的方法将空值数组(例如
byte?[]
)复制到非空值数组(例如
byte[]
)中?显然,我可以循环索引并单独复制每个元素

这是行不通的。它进行编译,但在运行时抛出一个
ArrayTypeMismatchException

 byte?[] sourceNullable = new byte?[]{1,2,3};
 byte[] destNonNullable = new byte[3];

 Array.Copy(sourceNullable,destNonNullable,3);
这会起作用,但我正在寻找“更好”的东西


您可以使用LINQ,如下所示:

byte[] destNonNullable = sourceNullable.Cast<byte>().ToArray();
您还可以通过以下方式减少开销。例如,如果您知道要复制的字节数可以被四整除,则可以执行以下操作:

Debug.Assert(N % 4 == 0); // Otherwise, the loop below wouldn't stop
for (int i = 0 ; i != N ; i += 4) {
    destNonNullable[i] = sourceNullable[i].Value;
    destNonNullable[i+1] = sourceNullable[i+1].Value;
    destNonNullable[i+2] = sourceNullable[i+2].Value;
    destNonNullable[i+3] = sourceNullable[i+3].Value;
}

我怀疑你能找到比单独复制每个值更有效的方法。毕竟,每个可为null的值与不可为null的值大小不同,因此不能只对字节进行blit。显式循环有什么问题?你为什么要浪费时间优化这个呢?:)我假设Array.Copy from
byte[]
byte[]
比显式循环更有效,所以我在寻找类似于
byte?[]
byte[]
的东西。记住,可空字节只不过是一个字节加上一个bool,指示字节是否可空。你不能在8位中拟合257个可能的值,所以在某个地方必须有一个额外的位,它在bool中。因此字节数组的大小是字节的一半?元素数相同的数组。没有神奇的方法可以快速复制一半字节。如果由于数组的范围检查而导致循环太慢,则可以使用不安全的代码将数组冻结在适当的位置,生成指向数组的指针,然后以这种方式复制。在示例中,对于具有正常、不可为空类型的普通数组副本,运行时是什么?这应该会给你理论上的上限。。。我认为字节是个坏例子,没有人会制造字节?阵列,然后担心性能…我一开始投了赞成票,认为这样会更快。不是。这要慢得多。+1迫使我学习循环展开在C#中仍然是相关的。和
byte[] destNonNullable = sourceNullable.Cast<byte>().ToArray();
byte[] destNonNullable = new[] {
    sourceNullable[0].Value
,   sourceNullable[1].Value
,   sourceNullable[2].Value
};
Debug.Assert(N % 4 == 0); // Otherwise, the loop below wouldn't stop
for (int i = 0 ; i != N ; i += 4) {
    destNonNullable[i] = sourceNullable[i].Value;
    destNonNullable[i+1] = sourceNullable[i+1].Value;
    destNonNullable[i+2] = sourceNullable[i+2].Value;
    destNonNullable[i+3] = sourceNullable[i+3].Value;
}