C#中数组扩容的几种方式介绍

假设有一个规定长度的数组,如何扩容呢?最容易想到的是通过如下方式扩容:

    class Program
    {
        static void Main(string[] args)
        {
            int[] arrs = new[] {1, 2, 3, 4, 5};
            arrs[5] = 6;
        }
    }

报错:未处理IndexOutOfRanageException,索引超出了数组界限。

创建一个扩容的临时数组,然后赋值给原数组,使用循环遍历方式

        static void Main(string[] args)
        {
            int[] arrs = new[] {1, 2, 3, 4, 5};
            int[] temp = new int[arrs.Length + 1];
            //遍历arrs数组,把该数组的元素全部赋值给temp数组
            for (int i = 0; i < arrs.Length; i++)
            {
                temp[i] = arrs[i];
            }
            //把临时数组赋值给原数组,这时原数组已经扩容
            arrs = temp;
            //给扩容后原数组的最后一个位置赋值
            arrs[arrs.Length - 1] = 6;
            foreach (var item in arrs)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

创建一个扩容的临时数组,然后赋值给原数组,使用Array的静态方法

像这种平常的数组间的拷贝,Array类肯定为我们准备了静态方法:Array.Copy()。

        static void Main(string[] args)
        {
            int[] arrs = new[] {1, 2, 3, 4, 5};
            int[] temp = new int[arrs.Length + 1];
            Array.Copy(arrs, temp, arrs.Length);
            //把临时数组赋值给原数组,这时原数组已经扩容
            arrs = temp;
            //给扩容后原数组的最后一个位置赋值
            arrs[arrs.Length - 1] = 6;
            foreach (var item in arrs)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

使用Array的静态方法扩容

但是,拷贝来拷贝去显得比较繁琐,我们也可以使用Array.Resize()方法给数组扩容。

        static void Main(string[] args)
        {
            int[] arrs = new[] {1, 2, 3, 4, 5};
            Array.Resize(ref arrs, arrs.Length + 1);
            //给扩容后原数组的最后一个位置赋值
            arrs[arrs.Length - 1] = 6;
            foreach (var item in arrs)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

总结:数组扩容优先考虑使用Array的静态方法Resize,其次考虑把一个扩容的、临时的数组赋值给原数组。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • C#中的小数和百分数计算与byte数组操作

    一.百分数 //按照四舍五入的国际标准 string p1 = (Math.Round(0.333367, 4)*100).ToString() + "%";//33.34% double dbdata = Math.Round((double)1 / (double)3, 5) * 100;//33.333 string p2 = String.Format("{0:F}", dbdata) + "%";//默认为保留两位 二.进制保留 带小数

  • C#常用数据结构之数组Array

    一.概述 数组为引用类型,其中的元素固定. 定义后不能增加删除元素.(如果事先不知道应包含多少元素,则应使用List集合).数组可以包含同一类型的多个元素. 数组实现了IEumerable,ICollection,IList接口的部分功能. 二.声明数组变量及使用 1.一维数组:[] 声明及初始化: int[] arr1 = new int[5];//声明带5个元素的数组 //或者 int[] arr2 = new int[] { 1, 3, 5, 7, 9 }; //或者 int[] arr3

  • C#中多维数组[,]和交错数组[][]的区别

    多维数组的声明 在声明时,必须指定数组的长度,格式为 type [lenght ,lenght ,lengh, ... ] int [,] test1 = new int [3,3]; 或声明时即赋值,由系统推断长度 int [,] test1 = { {1,2,3}, {1,2,3}, {1,2,3}, }; 交错数组的声明 声明时,至少需要指定第一维的长度,格式为 type [ ] [ ] [ ] ... int [][] test1 = new int[5][]; int [][] tes

  • C#实现数组元素的数据类型转换方法详解

    目录 一.场景假设 二.解决方案 三.问题延伸 四.数组类的静态转换方法 五.刨根问底 一.场景假设 假设有一串字符串如下所示,字符串中的数字之间已用英文状态下的逗号隔开.要求用此字符串中的数字快速生成int类型的数组,且尽可能使用最少的代码量. string str = "1,2,3,4,5,6,7,8,9"; 二.解决方案 我相信大多数同学在拿到这题的时候,一般都会给出以下的解决方案: public int[] String2IntArray(string str) { var s

  • 浅谈C#数组(一)

    目录 一.简单数组之一维数组 1.数组的声明 2.数组的初始化 3.访问数组元素 4.数组中使用引用类型 二.多维数组 三.锯齿数组 四.Array类 1.创建数组 2.复制数组 3.排序 五.数组作为参数 1.数组协变 2.ArraySegment<T> 前言: 如果需要使用同一类型的多个对象,可以使用数组和集合.C#用特殊的记号声明,初始化和使用数组.Array类在后台发挥作用,它为数组中的元素排序和过滤提供了多个方法.使用枚举器,可以迭代数组中的所有元素. 如果需要使用不同类型的多个对象

  • C#中的数组用法详解

    目录 一.简单数组(一维数组) 1.数组的声明 2.数组的初始化 3.访问数组元素 4.数组中使用引用类型 二.多维数组 三.锯齿数组 四.Array类 1.创建数组 2.复制数组 3.排序 五.数组作为参数 1.数组协变 2.ArraySegment<T> 六.枚举集合 1.IEnumerator接口 2.foreach语句 3.yield语句 (1).迭代集合的不同方式 (2).用yield return 返回枚举器 七.元组(Tuple) 八.结构比较 如果需要使用同一类型的多个对象,可

  • C#集合之位数组的用法

    如果需要处理的数字有许多位,就可以使用BitArray类和BitVector32结构.BitArray类位于System.Collection,BitVector32结构位于System.Collection.Specialized.这两种类型最重要的区别是,BitArray类可以重新设置大小,如果事先不知道需要的位数,就可以使用BitArray类.BitVector32结构是基于栈的,因此比较快.BitVector32结构仅包含32位,它们存储在一个整数中. 1.BitArray类 BitAr

  • C#中获取二维数组的行数和列数以及多维数组各个维度的长度

    如何获取二维数组中的元素个数呢? int[,] array = new int[,] {{1,2,3},{4,5,6},{7,8,9}};//定义一个3行3列的二维数组 int row = array.Rank;//获取维数,这里指行数 int col = array.GetLength(1);//获取指定维度中的元素个数,这里也就是列数了.(0是第一维,1表示的是第二维) int col = array.GetUpperBound(0)+1;//获取指定维度的索引上限,在加上一个1就是总数,这

  • C#操作Byte数组和十六进制进行互转

    一.Byte 数组转十六进制字符串 /// <summary> /// Byte 数组转十六进制字符串 /// </summary> /// <param name="Bytes"></param> /// <returns></returns> public static string ByteToHex(byte[] Bytes) { string str = string.Empty; foreach (by

  • 浅谈C#数组(二)

    目录 一.枚举集合 1.IEnumerator接口 2.foreach语句 3.yield语句 二.元组(Tuple) 三.结构比较 可以先了解上一篇文章内容C#数组(一) 一.枚举集合 在foreach语句中使用枚举,可以迭代集合中的元素,且无需知道集合中元素的个数.foreach语句使用一个枚举器.foreach会调用实现了IEnumerable接口的集合类中的GetEumerator()方法.GetEumerator()方法返回一个实现IEnumerator接口的对象枚举.foreach语

随机推荐