C#把某个数组的一部分复制到另一个数组中的两种方法:Buffer.BlockCopy和Array.Copy
static void Main(string[] args)
{
int[] src = new[] { , , , , , };
const int destLen = ;//目标数组大小
int int_size = sizeof(int);//用于获取值类型的字节大小。
int[] dest = new int[destLen];
//只支持基元类型,按字节偏移复制
Buffer.BlockCopy(src, (src.Length - destLen) * int_size, dest, , destLen * int_size);
foreach (var i in dest)
{
Console.Write(i + " ");
}
Console.WriteLine("\n-------------------------------------------");
string[] srcstr = new[] { "A", "B", "C", "D", "E", "F" };
object[] destobj = new object[src.Length - ];
//移除的元素个数
const int dellen = ;
//保证不破坏目标数组的元素(回滚)。不装箱、拆箱、或向下转换,否则报错。
//如果srcstr改为src则报错,因为装箱。
Array.ConstrainedCopy(srcstr, dellen, destobj, , srcstr.Length - dellen);
foreach (var s in destobj)
{
Console.Write(s + " ");
}
}
对指定数组和目标数组,两者类型一致的前提下,进行复制10亿次,
消耗时间如下:
copy:59.374s,constrainecopy:48.415 s,blockcopy:23.219s
代码没什么就是测试下,核心测试如下:
int[] ints = { 1534, 233, 332, 423, 524, 3246, 4357, 734, 567, 43, 34254, 325, 3325, 2423, 345, 575, 235, 1, 342, 1, 6, 54645, 5432, 5 };
int[] dest = new int[ints.Length];
Array.Copy(ints, dest, ints.Length);
Array.ConstrainedCopy(ints, 0, dest, 0, ints.Length);
Buffer.BlockCopy(ints, 0, dest, 0, ints.Length * 4);
注解分析:
1,Array.Copy在CLR处理机制中最灵活,最强大,可装箱,拆箱复制,可加宽CLR基元类型,可内部判断实现了IFarmattable接口的兼容转换,当然这种强大方式必然会带来一定的性能损失。
2,Array.ConstrainedCopy 对复制要求严格,只能是同类型或者源数组类型是目标类型的派生元素类型,不执行装箱,拆箱,向下转换
3,Buffer.BlockCopy 则从本质上以字节为复制单位,这在底层语言C,C++的处理优势上,同理,效率之高可以理解。
当然如果对性能要求不高,Copy足矣,毕竟在上千次复制下,三者基本没消耗多少时间。使用时可根据项目需求斟酌选择!
问题:c#如何把某个长数组的一部分复制到另一个短数组里面
byte[] shortAry=new byte[4];
byte[] longAry=new byte[20];
如何把longAry[5,9(不含)]这4个字节复制到shortAry里面?
不要用循环。
用Array.Copy方法将数组或者数组的一部分复制到另个数组。Array.Copy是静态方法,有多个重载版本。其中常用的是:
public static void Copy(
Array sourceArray,
int sourceIndex,
Array destinationArray,
int destinationIndex,
int length);
各个参数含义如下
sourceArray —— 源数组
sourceIndex —— 表示 sourceArray 中复制开始处的索引
destinationArray —— 目标数组,它接收数据
destinationIndex —— 表示 destinationArray 中存储开始处的索引
length —— 要复制的元素数目。
用法举例如下:
(1)复制数组的一部分到另一个数组
int[] src = { , , , , , , , , , , , , , , };
int[] dest = new int[];
// 将数组 src 中元素 2,3,4,5 复制到 dest
Array.Copy(src, , dest, , );
(2)复制整个数组
int[] src = { , , , , , , , , , , , , , , };
int[] dest = new int[src.Length];
// 将数组 src 所有元素复制到 dest
Array.Copy(src, , dest, , src.Length);
其它参考链接:C#数据结构-Array.Copy和Buffer.BlockCopy详解
C#把某个数组的一部分复制到另一个数组中的两种方法:Buffer.BlockCopy和Array.Copy的更多相关文章
- PHP中数组合并的两种方法及区别介绍
PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = ...
- ZeroMQ接口函数之 :zmq_msg_copy - 把一个消息的内容复制到另一个消息中
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_copy zmq_msg_copy(3) ØMQ Manual - ØMQ/3.2.5 Name zm ...
- SQL把表中的数据复制到另一个数据库中
1 删除整张表的数据,并还原自增长值TRUNCATE TABLE TbWeixinActivity 2 3张表左连接select a.ID,c.Name,b.nickname,a.CreateDate ...
- php获取数组中重复数据的两种方法
分享下php获取数组中重复数据的两种方法. 1,利用php提供的函数,array_unique和array_diff_assoc来实现 <?php function FetchRepeatMem ...
- SQL数据库中把一个表中的数据复制到另一个表中
1.如果是整个表复制表达如下: insert into table1 select * from table2 2.如果是有选择性的复制数据表达如下: insert into table1(colu ...
- OC动态创建的问题变量数组.有数组,在阵列13要素,第一个数据包阵列,每3元素为一组,分成若干组,这些数据包的统一管理。最后,一个数组.(要动态地创建一个数组).两种方法
<span style="font-size:24px;">//////第一种方法 // NSMutableArray *arr = [NSMutable ...
- python将两个数组合并成一个数组的两种方法的代码
内容过程中,把写内容过程中常用的内容收藏起来,下面的资料是关于python将两个数组合并成一个数组的两种方法的内容,希望能对小伙伴们有帮助. c1 = ["Red","G ...
- OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法
<span style="font-size:24px;">//////第一种方法 // NSMutableArray *arr = [NSMutableArray a ...
- 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式
表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...
随机推荐
- 记录一个调了半天的问题:java.lang.SecurityException: Permission denied (missing INTERNET permission?)
Move the <uses-permission> elements outside of <application>. They need to be immediate ...
- Python基础(1)--Python编程习惯与特点
1.代码风格 在Python中,每行程序以换行符代表结束,如果一行程序太长的话,可以用“\”符号扩展到下一行.在python中以三引号(""")括起来的字符串,列表,元组 ...
- PAT 01-2
#include<stdio.h> #include<stdlib.h> int main() { int k; int *data; int i; int ThisSum, ...
- 快速与MySQL交互,使用XMAPP打开MySQL数据库,并用shell进行与MySQL交互<Window 10>
1.如果想要通过XAMPP shell登录MySQL,还需要下载安装好XAMPP. 2.双击打开xampp-control.exe,会出现以下界面,点击开启Apache和MySQL,这样我们就开启服务 ...
- 修复 Java 内存模型,第 2 部分——Brian Goetz
转自Java并发大师Brain Goetz:http://www.ibm.com/developerworks/cn/java/j-jtp03304/ (中文地址) http://www.ibm.co ...
- 最近学习linux常用命令。
一.文件系统的管理tips:输入命令的时候要常用tab键来补全 ls 查看目录信息 ( ls / ) ls -l 等价于 llpwd 查看当前所处的路径 cd 切换目录 (cd /) ,如果不带参数则 ...
- 通过beego快速创建一个Restful风格API项目及API文档自动化
通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...
- Hadoop中WritableComparable 和 comparator
1.WritableComparable 查看HadoopAPI,如图所示: WritableComparable继承自Writable和java.lang.Comparable接口,是一个Writa ...
- Quicksum-S.B.S.
quicksum Queation: Given a string of digits, find the minimum number of additions required for the s ...
- Html5 Geolocation获取地理位置信息
Html5中提供了地理位置信息的API,通过浏览器来获取用户当前位置.基于此特性可以开发基于位置的服务应用.在获取地理位置信息前,首先浏览器都会向用户询问是否愿意共享其位置信息,待用户同意后才能使用. ...