当前位置: 首页 > 编程语言 > C#

详解c#中Array,ArrayList与ListT的区别、共性与相互转换分享

时间:2023-04-10 18:23:25 C#

C#学习教程:详解c#中Array、ArrayList、ListT的区别、共性和相互转换并获取元素交错数组定义初始化赋值获取元素及单个赋值方法及属性更改查询获取长度Array.ConvertAll()数据类型转换切片获取单个元素及赋值Array.ForEach循环ArrayList定义初始化赋值循环方法及属性List定义初始化循环方法和属性属性长度属性值加法查询删除切片循环数据类型转换Array、ArrayList和List之间的区别Array到ArrayListArray到ListList到ArrayList到ArrayListArrayList到Array数组Array的打印ArrayList的打印List的打印Array、ArrayList和ListArray、ArrayList和List都是从IList派生出来的,它们都实现了IEnumerable接口。从某种意义上说,ArrayList和List都属于集合的范畴,因为它们都来自于汇编System.Collections,但是因为它们都是存储多个变量的数据结构,并不是键值对的组合,并且有没有先进先出或先进后出机制,所以称为数组。我们一般称Array、ArrayList和List为数组。Array数组必须在没有初始化的情况下定义和赋值(声明数组变量而不进行初始化除外)必须定义数组的最外层长度。例如:int[]vs=newint[10];int[,]duoWei=newint[3,4];int[][]jiaoCuo=newint[3][];//数组由三个一维数组组成一维数组的定义方式与定义数组的方式类似int[]array=newint[5];初始化赋值的初始化方式类似于int[]array1=newint[]{1,3,5,7,9};隐式初始化也是可能的int[]array2={1,3,5,7,9};string[]weekDays2={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};先用类似下面的方式声明,然后赋值int[]array3;array3=newint[]{1,3,5,7,9};//好的//array3={1,3,5,7,9};//错误多维数组数组可以有多个维度。多维数组的每个元素都是声明时数组类型的元素。例如,int[,]的每个元素都是int类型,而不是int[]。也就是说,多维数组不能算作“数组的数组”。定义声明一个二维数组的长度,类似如下int[,]array=newint[4,2];初始化赋值以类似于以下的方式初始化多维数组://Two-dimensionalarray.int[,]array2D=newint[,]{{1,2},{3,4},{5,6},{7,8}};//指定维度的同一个数组。int[,]array2Da=newint[4,2]{{1,2},{3,4},{5,6},{7,8}};//具有字符串元素的类似数组。string[,]array2Db=newstring[3,2]{{“一”,“二”},{“三”,“四”},{“五”,“六”}};//三维数组。int[,,]array3D=newint[,,]{{{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}};同样在未指定的级别初始化数组int[,]array4={{1,2},{3,4},{5,6},{7,8}};声明数组变量而不初始化:int[,]array5;array5=newint[,]{{1,2},{3,4},{5,6},{7,8}};//好的//array5={{1,2},{3,4},{5,6},{7,8}};//Error元素的赋值和获取可以使用类似array[1,2]的方法获取数组并赋值。GetLength(0)可以得到最外层数组的长度,GetLength(1)可以得到第二层数组的长度。等等。给二维数组duoWei循环赋值的方法如下:Console.WriteLine("二维数组赋值");for(inti=0;i(TInput[],Converter)来转换数组类型。参数如下:arrayTInput[]要转换为目标类型的从零开始的一维数组。converterConverter用于将每个元素从一种类型转换为另一种类型的转换器。来源:[Array.ConvertAll(TInput],Converter)方法(系统)|MicrosoftDocsdemo如下:double[]vs3=Array.ConvertAll(vs,item=>(double)item);切片默认只能对一维数组进行切片,或者通过交错数组得到的一维数组也可以进行切片。切片的方式类似于vs[1..5],表示vs数组从1到5,左闭右开。^1表示-1,即最后一个元素。[^3..^1]表示倒数第三个元素到倒数第一个元素,左闭右开。获取单个元素并赋值可以使用以下方法获取单个元素并为单个元素赋值://一维数组Console.WriteLine(vs[1]);VS[1]=2;//多维数组Console.WriteLine(duoWei[1,2]);duoWei[1,2]=3;//交错数组Console.WriteLine(jiaoCuo[1][0]);娇错[1][0]=0;Array.ForEach循环System.Array中还有一个ForEach方法,是针对Array的。演示:Array.ForEach(vs,item=>Console.WriteLine(item));ArrayList定义以类似于以下的三种方式之一声明ArrayList:ArrayList()初始化ArrayList类的新实例,该实例为空且具有默认初始容量。ArrayList(ICollection)初始化ArrayList类的新实例,其中包含从指定集合复制的元素,并且初始容量等于复制的元素数。ArrayList(Int32)初始化ArrayList类的一个新实例,该实例为空且具有指定的初始容量。ArrayList可以看作是一个长度可以自由变换的数组,可以包含不同数据类型的元素。初始赋值你可以使用类似于下面的方法来初始化赋值:ArrayListarrayList1=newArrayList(){12,334,3,true};Loop循环可以使用for和foreach。foreach(arrayList中的var项目){Console.WriteLine(item);}方法和属性类似于list,但没有ConvertAll方法。ArrayList本身没有ForEach方法,但也可以使用传统的foreach方法(就像前面提到的ArrayList循环一样)。具体方法和属性请参考List部分的方法和属性。List定义使用以下三种方法中的任何一种来声明List:List()初始化List类的一个新实例,该实例为空,具有默认初始容量。List(IEnumerable)初始化List类的新实例,该实例包含从指定集合复制的元素,并具有足够的容量来容纳复制的元素。List(Int32)初始化List类的一个新实例,该实例为空且具有指定的初始容量。初始化在声明时以类似于以下的方式初始化:ListlistA=newList(){"hello","","wrold"};LoopingList有一个名为ForEach的方法:publicvoidForEach(Actionaction);该方法的本质是要在List的每个元素上执行的Action委托。Action的参数是循环过程中List的每一个元素。演示如下://declareListlistA=newList(){"hello","","wrold"};//循环变量i=0;listA.ForEach(item=>{Console.WriteLine($"{i+1}th");Console.WriteLine(item);i++;});从长度获取、增删改查、数据类型转换、分片和循环等方面分析了方法和属性。除了List类型本身的数据类型转换和ForEach方法外,都适用于ArrayList。首先声明一个List作为演示的基础:ListlistA=newList(){"hello","","wrold"};属性长度Count属性可以获得长度Console.WriteLine(listA.Count);属性值Console.WriteLine(listA[0]);increase表示添加元素,可以使用Add方法:listA.Add("12");检查IndexOf获取位置,检查Contains获取是否包含。Console.WriteLine(listA.IndexOf("12"));Console.WriteLine(listA.Contains("12"));DeleteRemove基于数据,RemoveAt基于位置。listA.Remove("12");listA.RemoveAt(1);Change元素内容可以通过类似listA[1]="Change";的方式修改。切片您可以使用GetRange(intindex,intcount)来执行切片操作。第一个参数是切片的起始位置,第二个参数是切片的个数,即从索引向后数多少个数。Console.WriteLine(listA.GetRange(1,1).Count);LoopList有一个名为ForEach的方法,它本质上是一个要在List的每个元素上执行的Action委托。Action的参数是循环过程中List的每一个元素。演示如下://declareListlistA=newList(){"hello","","wrold"};//循环变量i=0;listA.ForEach(item=>{Console.WriteLine($"{i+1}");Console.WriteLine(item);i++;});数据类型转换你可以使用ConvertAll来转换数组的数据类型,List方法自带。System.Array也有一个ConvertAll方法,它是针对Array的。列表<对象>listObject=listA.ConvertAll(s=>(object)s);区分成员单一类型长度可变切片友好方法丰富添加查询删除修改ConvertAll一维数组????检查,更改?多维数组?????检查,更改?Interleaved数组????检查,更改?ArrayList????增加,删除,修改,?List????增加,删除,修改?Array最大的优点就是slice-friendly,可以像[1..3]一样使用,这是比GetRange更直观的切片方式。可以通过ToArray方法将List类型转换为Array。Array、ArrayList和List之间的转换这部分的demo代码的细节可以从Array、ArrayList和List之间的转换·sogeisetsu/Solution1@88f27d6(github.com)中获取。首先分别声明这三种数据类型。//声明数组int[]a=newint[]{1,3,4,5,656,-1};//声明多维数组int[,]aD=newint[,]{{1,2},{3,4}};//声明交错数组int[][]aJ=newint[][]{newint[]{1,2,3},newint[]{1}};//声明ArrayListArrayListb=newArrayList(){1,2,344,"233",true};//声明ListListc=newList();数组到ArrayList//数组到ArrayListArrayListaToArrayList=newArrayList(a);数组到ListListaToList=newList(a);列表aToLista=a.ToList();List到Arrayint[]cToList=c.ToArray();List到ArrayListArrayListcToArrayList=newArrayList(c);ArrayList到Array//ArrayList到Arrayobject[]bToArray=b.ToArray();数据类型的准确性丢失。简单的说,转换后的Array会变成一个对象。这种转换意义不大。如果转换后使用Array.ConvertAll方法转换数据类型,很可能会出现Unabletocastobjectoftype'System.String'totype'System.Int32'等错误。这是因为ArrayList本身的成员不能是单一类型。数组打印数组打印对于数组打印,我找到了四种方式,如下:callArray.ForEachArray.ForEach(a,item=>Console.WriteLine(item));传统的forEachforeach(varitemina){Console.WriteLine(item);}传统for(inti=0;i的打印除了传统的for和foreach,List的打印还有List本身自带的foreach:vari=0;listA.ForEach(item=>{Console.WriteLine($"{i+1}th");Console.WriteLine(item);i++;});请注意:ArrayList和List都没有调用string.Join和调用Array.ForEach打印数组的两种方式。至此,这篇讲解c#中Array、ArrayList、List的区别、共性和相互转换的文章就介绍到这里了。希望对大家的学习有所帮助,希望大家多多支持。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: