C#中数组合并(Array.Copy的用法)

6 篇文章 1 订阅

首先应该理解数组在《数据结构》中的概念,数组是一个线性表,在定义的时候由内存分配一个指定大小的内存空间,所以相较于链表(C#中又叫集合)缺点就是不利于扩展。
针对合并两个数组的方法就是创建一个新的数组(大于两个数组的大小之和)来存放两个数组,在没有用到Array.Copy()这个又C#程序集提供的方法时,我们只能将数组中元素一个一个依次放入新数组中,如下所示

  /// <summary>
        /// 将数组a,b进行合并
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        private static byte[] Combine(byte[] a, byte[] b)
        {
            byte[] c = new byte[a.Length + b.Length];
            for (int i = 0; i < a.Length; i++)
            {
                c[i] = a[i];
            }
            for (int j = a.Length; j < a.Length+ b.Length; j++)
            {
                c[j] = b[j];
            }
            return c;
        }

这个方法写法上没什么问题,但有一个严重的问题,在数据量较大的时候,相较于Array.Copy效率极低
同时也不如Array.Copy()一行代码来的简洁。如下所示

  /// <summary>
        /// 将数组a,b进行合并
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        private static byte[] Combine2(byte[] a, byte[] b)
        {
            byte[] c = new byte[a.Length + b.Length];

            Array.Copy(a, 0, c, 0, a.Length);
            Array.Copy(b, 0, c, a.Length, b.Length);

            return c;
        }

效率比较
1将两个长度为50000的数组进行合并

using System;
using System.Collections.Generic;
using System.Text;

namespace ArrayCopyTest
{
    class Program
    {

        static void Main(string[] args)
        {
            //使用两个长度为50000的数组
            byte[] a = new byte[50000];
            byte[] b = new byte[50000];
            #region 对a,b进行随机赋值
            Random random = new Random();
            for (int i = 0; i < a.Length; i++)
            {
                a[i] = (byte)random.Next(0, 255);
            }
            for (int i = 0; i < b.Length; i++)
            {
                b[i] = (byte)random.Next(0, 255);
            }
            #endregion


            Console.WriteLine("开始记录时间");
            DateTime beforDT = DateTime.Now;//记录开始时间
            byte[] c1 = Combine1(a, b);
            DateTime afterDT = DateTime.Now;//记录结束时间
            TimeSpan ts = afterDT.Subtract(beforDT);    //时间差
            Console.WriteLine("Combine1总共花费{0}ms.", ts.TotalMilliseconds);

            Console.WriteLine("开始记录时间");
            DateTime beforDT2 = DateTime.Now;//记录开始时间
            byte[] c2 = Combine2(a, b);
            DateTime afterDT2 = DateTime.Now;//记录结束时间
            TimeSpan ts2 = afterDT2.Subtract(beforDT2);    //时间差
            Console.WriteLine("Combine2总共花费{0}ms.", ts2.TotalMilliseconds);
            Console.ReadKey();
        }


        /// <summary>
        /// 将数组a,b进行合并
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        private static byte[] Combine1(byte[] a, byte[] b)
        {
            byte[] c = new byte[a.Length + b.Length];
            for (int i = 0; i < a.Length; i++)
            {
                c[i] = a[i];
            }
            for (int j = a.Length; j < a.Length + b.Length; j++)
            {
                c[j] = b[j-a.Length];
            }
            return c;
        }


        /// <summary>
        /// 将数组a,b进行合并
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        private static byte[] Combine2(byte[] a, byte[] b)
        {
            byte[] c = new byte[a.Length + b.Length];

            Array.Copy(a, 0, c, 0, a.Length);
            Array.Copy(b, 0, c, a.Length, b.Length);

            return c;
        }

    }
}

在这里插入图片描述
数组长度改为5000000,花费时间更加明显
在这里插入图片描述

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MelanceXin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值