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;
}