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

本文探讨了在C#中合并两个数组时,使用手动复制元素与使用Array.Copy()方法的效率差异。通过示例代码展示,当数组长度较大时,Array.Copy()方法在时间和代码简洁性上都优于手动复制。对于长度为50000和5000000的数组,Array.Copy()方法表现出显著的效率优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先应该理解数组在《数据结构》中的概念,数组是一个线性表,在定义的时候由内存分配一个指定大小的内存空间,所以相较于链表(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,花费时间更加明显
在这里插入图片描述

<think>好的,我现在需要回答用户关于如何在C#合并多个数组的问题,并提供示例代码。首先,我需要回忆C#合并数组的几种常见方法。根据用户提供的引用,特别是引用[1]和引用[4],用户可能已经了解到使用LINQ的Concat方法以及手动合并的方式。 首先,我应该确认不同的合并方法。常见的包括使用LINQ的Concat、手动循环复制以及Array.Copy方法。用户提到的引用[1]中提到了使用LINQ的Concat和ToArray方法,这是一个简洁的方式。引用[4]则提到将数组2的元素赋值给数组1,这可能涉及到手动复制或调整数组大小,但需要更多的代码。 接下来,我需要考虑如何组织这些方法,并给出示例代码。每个方法的步骤需要清晰,并且代码要正确。例如,使用LINQ时,需要引入System.Linq命名空间,而手动复制可能需要循环或Array.Copy。 另外,用户可能关心如何处理多个数组合并,而不仅仅是两个数组。因此,示例代码应该展示如何合并两个数组,以及如何扩展到多个数组的情况。例如,使用LINQ可以链式调用Concat多次,而手动方法则需要循环处理每个数组。 还需要注意数组的不可变性。在C#中,数组长度固定,因此合并时需要创建新数组。这一点在手动方法中尤为重要,需要计算总长度,然后逐个复制元素。 最后,要确保代码符合C#语法规范,例如正确的数组声明、方法调用等。同时,引用用户提供的引用,特别是引用[1]和引用[4],以支持答案的可靠性。</think>在C#合并多个数组的常见方法如下,分为LINQ方法和手动实现两种方式: ### 方法一:使用LINQ的Concat()方法(推荐) ```csharp using System.Linq; int[] array1 = { 1, 2, 3 }; int[] array2 = { 4, 5 }; int[] array3 = { 6, 7, 8 }; // 合并两个数组 int[] merged1 = array1.Concat(array2).ToArray(); // 结果:[1,2,3,4,5] // 合并多个数组 int[] merged2 = array1.Concat(array2).Concat(array3).ToArray(); // 结果:[1,2,3,4,5,6,7,8] ``` 该方法通过链式调用`Concat()`实现多数组合并,最后使用`ToArray()`转换为新数组[^1]。 ### 方法二:手动数组复制 ```csharp int[] arrayA = { 10, 20 }; int[] arrayB = { 30, 40, 50 }; // 创建新数组 int[] merged = new int[arrayA.Length + arrayB.Length]; // 复制第一个数组 Array.Copy(arrayA, 0, merged, 0, arrayA.Length); // 复制第二个数组 Array.Copy(arrayB, 0, merged, arrayA.Length, arrayB.Length); // 结果:[10,20,30,40,50] ``` 此方法通过`Array.Copy`实现,需预先计算总长度[^4]。 ### 方法三:循环赋值(适合动态合并) ```csharp int[] CombineArrays(params int[][] arrays) { int totalLength = arrays.Sum(a => a.Length); int[] result = new int[totalLength]; int offset = 0; foreach (var arr in arrays) { Array.Copy(arr, 0, result, offset, arr.Length); offset += arr.Length; } return result; } // 使用示例 var combined = CombineArrays(new int[]{1}, new int[]{2,3}, new int[]{4,5,6}); // 结果:[1,2,3,4,5,6] ``` 此方法可接收任意数量的数组参数,适合动态合并场景。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MelanceXin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值