C#把某个数组的一部分复制到另一个数组中的两种方法:Buffer.BlockCopy和Array.Copy

static void Main(string[] args)
        {
            int[] src = new[] { 1, 2, 3, 4, 5, 6 };
            const int destLen = 4;//目标数组大小
            int int_size = sizeof(int);//用于获取值类型的字节大小。
            int[] dest = new int[destLen];
            //只支持基元类型,按字节偏移复制
            Buffer.BlockCopy(src, (src.Length - destLen) * int_size, dest, 0, 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 - 2];
            //移除的元素个数
            const int dellen = 2;
            //保证不破坏目标数组的元素(回滚)。不装箱、拆箱、或向下转换,否则报错。
           //如果srcstr改为src则报错,因为装箱。
            Array.ConstrainedCopy(srcstr, dellen, destobj, 0, 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 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
int[] dest = new int[4];
// 将数组 src 中元素 2,3,4,5 复制到 dest
Array.Copy(src, 1, dest, 0, 4);

(2)复制整个数组

int[] src = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
int[] dest = new int[src.Length];
// 将数组 src 所有元素复制到 dest
Array.Copy(src, 0, dest, 0, src.Length);
时间: 2024-10-16 01:12:57

C#把某个数组的一部分复制到另一个数组中的两种方法:Buffer.BlockCopy和Array.Copy的相关文章

PHP中数组合并的两种方法及区别介绍

PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = array( 'where' => 'uid=2', 'order' => 'uid desc', ); 1. array_merge,如果两个数组存在相同的key,后面的一个会覆盖前面的 复制代码代码如下: <?php $c = array_merge($a, $b); var_expo

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 zmq_msg_copy - 把一个消息的内容复制到另一个消息中 Synopsis int zmq_msg_copy (zmq_msg_t *dest, zmq_msg_t *src); Description zmq_msg_copy()函数会将src指定的消息对象中的内容复制到dest指定的消息对象

一个表中的某字段中所有的数据,复制到另一个表中

项目要求,织梦被黑了,又不太会修复织梦的漏洞.决定换一个自己开发的后台吧!问题来了,织梦中的文章数据要全部拿出来,导入到新的后台中. 因为,现有后台的数据表跟织梦的表的结构完全不一样,再加上织梦用于保存文章是用了,dede_addonarticle,dede_archives,这两个表.现在是要将两个表中有用的字段的数据 复制到一个新的表中的一个字段内. 第一步,同步他们的主键,dede_addonarticle的主键是aid,dede_archives的主键是id 1,一张写好了结构的,没有数

如何将一个数据库中的一个表复制到另一个数据库中的表中

如何将一个数据库中的一个表复制到另一个数据库中的表中 2013-09-11 17:13匿名 | 浏览 13763 次 如何将一个数据库中的一个表复制到另一个数据库中的表中两个表的列名不同.有知道的么?SQL语句直接导过去.! 2013-09-12 20:26网友采纳 热心网友 如果另一个库中没有同名的表select * into b数据库.dbo.a表 from a数据库.dbo.a表 where 条件 如果是追加到另一个表中inert into b数据库.dbo.a表select * from

OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法

<span style="font-size:24px;">//////第一种方法 // NSMutableArray *arr = [NSMutableArray array]; // for (int i = 0; i < 13; i ++) { // [arr addObject:[NSString stringWithFormat:@"lanou%d",i + 1]]; // } // NSLog(@"%@",arr);

[Arduino] 逗号分隔文本到数组的两种方法

以下是今日练习通过逗号来分割字符数组/字符串的2个例子和方法" 1.通过indexOf函数 /* *Splitsplit sketch *split a comma-separated string */ String message = "Peter,Paul,Mary"; int commaPosition; void setup(){ Serial.begin(9600); } void loop(){ Serial.println(message); do{ comm

javascript 判断数组中的重复内容的两种方法 by FungLeo

javascript 判断数组中的重复内容的两种方法 by FungLeo 前言 一般,我们可能会给数组去重,这个操作并不复杂,执行一个循环就是了.现在,我要做的是,判断数组中是否有重复的内容,如果有,返回 true 否则,返回 false. 思路 把数组变成字符串 循环原数组,拿每一个字段和这个字符串进行比对,看是否有重复 如何拿A字符串和B字符串进行对比,并且要求判断出B字符串中包含过个A字符串呢? 方法一 indexOf() 和 lastIndexOf() 对比法. 首先,我们构建代码:

OC动态创建的问题变量数组.有数组,在阵列13要素,第一个数据包阵列,每3元素为一组,分成若干组,这些数据包的统一管理。最后,一个数组.(要动态地创建一个数组).两种方法

<span style="font-size:24px;">//////第一种方法 //        NSMutableArray *arr = [NSMutableArray array]; //        for (int i = 0; i < 13; i ++) { //            [arr addObject:[NSString stringWithFormat:@"lanou%d",i + 1]]; //        

《将一个磁盘文件中的信息复制到另一个磁盘文件中(怎样向文件读写字符)》

注意:程序中的feof(in)是检查in所指向的文件是否结束.如果是,则函数值为1(真),否则为0(假), 也就是“!feof(in)为真”,在while循环中检查"!feof(in)"为真,就执行循环体. //将一个磁盘文件中的信息复制到另一个磁盘文件中去,要求将上例建立的f:\\FILE_1\\file.txt文件中的//内容复制到另一个磁盘文件f:\\FILE_1\\file_1.txt文件中.#include<stdio.h>#include<stdlib.h