改变数组大小

声明后可以更改数组大小吗? 如果没有,是否有任何替代arrays?
我不想创build一个大小为1000的数组,但创build时我不知道数组的大小。

不,请尝试使用强types列表 。

例如:

而不是使用

int[] myArray = new int[2]; myArray[0] = 1; myArray[1] = 2; 

你可以这样做:

 List<int> myList = new List<int>(); myList.Add(1); myList.Add(2); 

列出使用数组来存储数据,以便通过能够添加和删除项目而不必担心需要手动更改大小,从而获得数组的速度优势。

这并不意味着一个数组的大小(在这种情况下,一个List )不会改变 – 因此手动强调这个词。

只要数组达到预定义的大小,JIT就会在堆上分配一个新的数组,这个数组的大小是原来的两倍。

您可以使用MSDN中logging的Array.Resize()

但是,是的,我同意Corey,如果你需要一个dynamic大小的数据结构,我们有List

重要提示: Array.Resize() 不会调整数组的大小 (方法名称是误导性的),它会创build一个新的数组并仅replace您传递给该方法的引用 。

一个例子:

 var array1 = new byte[10]; var array2 = array1; Array.Resize<byte>(ref array1, 20); // Now: // array1.Length is 20 // array2.Length is 10 // Two different arrays. 

您可以使用.net 3.5及更高版本中的Array.Resize() 。 此方法分配一个具有指定大小的新数组,将旧数组中的元素复制到新数组中,然后用新数组replace旧数组。 (所以你将需要两个arrays可用的内存,因为这可能使用下面的Array.Copy

使用这种方法的字节数组:

原来:

 byte[] bytes = new byte[0]; 

无论何时需要(需要提供延伸的原始长度):

 Array.Resize<byte>(ref bytes, bytes.Length + requiredSize); 

重启:

 Array.Resize<byte>(ref bytes, 0); 

键入列表方法

原来:

 List<byte> bytes = new List<byte>(); 

无论何时需要:

 bytes.AddRange(new byte[length]); 

释放/清除:

 bytes.Clear() 

使用System.Collections.Generic.List

改用List<T> 。 例如,而不是一个int数组

 private int[] _myIntegers = new int[1000]; 

使用

 private List<int> _myIntegers = new List<int>(); 

后来

 _myIntegers.Add(1); 

在C#中, Array.Resize是将任何数组调整为新大小的最简单的方法,例如:

 Array.Resize<LinkButton>(ref area, size); 

在这里,我想调整LinkBut​​ton数组的大小:

<LinkButton> =指定数组types
ref area = ref是关键字,'area'是数组名
size =新的大小数组

在C#中,数组不能dynamicresize。

  • 一种方法是使用System.Collections.ArrayList而不是native array

  • 另一种(更快的)解决scheme是重新分配不同大小的数组,并将旧数组的内容复制到新数组中。

    generics函数resizeArray (下面)可以用来做到这一点。

     public static System.Array ResizeArray (System.Array oldArray, int newSize) { int oldSize = oldArray.Length; System.Type elementType = oldArray.GetType().GetElementType(); System.Array newArray = System.Array.CreateInstance(elementType,newSize); int preserveLength = System.Math.Min(oldSize,newSize); if (preserveLength > 0) System.Array.Copy (oldArray,newArray,preserveLength); return newArray; } public static void Main () { int[] a = {1,2,3}; a = (int[])ResizeArray(a,5); a[3] = 4; a[4] = 5; for (int i=0; i<a.Length; i++) System.Console.WriteLine (a[i]); } 
  private void HandleResizeArray() { int[] aa = new int[2]; aa[0] = 0; aa[1] = 1; aa = MyResizeArray(aa); aa = MyResizeArray(aa); } private int[] MyResizeArray(int[] aa) { Array.Resize(ref aa, aa.GetUpperBound(0) + 2); aa[aa.GetUpperBound(0)] = aa.GetUpperBound(0); return aa; } 

是的,可以调整数组的大小。 例如:

 int[] arr = new int[5]; // increase size to 10 Array.Resize(ref arr, 10); // decrease size to 3 Array.Resize(ref arr, 3); 

如果使用CreateInstance()方法创build数组,则Resize()方法不起作用。 例如:

 // create an integer array with size of 5 var arr = Array.CreateInstance(typeof(int), 5); // this not work Array.Resize(ref arr, 10); 

数组大小不是dynamic的,即使我们可以调整它的大小。 如果你想要一个dynamic数组,我想我们可以使用generics列表。

 var list = new List<int>(); // add any item to the list list.Add(5); list.Add(8); list.Add(12); // we can remove it easily as well list.Remove(5); foreach(var item in list) { Console.WriteLine(item); } 

使用列表(其中T是任何types或对象),当您要添加/删除数据,因为调整数组的大小是昂贵的。 你可以阅读更多关于被认为有害的数组,而列表可以被添加到新的logging可以追加到最后。 它根据需要调整其大小。

列表可以通过以下方式进行初始化

使用集合初始值设定项

 List<string> list1 = new List<string>() { "carrot", "fox", "explorer" }; 

在集合构造器中使用var关键字。

 var list2 = new List<string>() { "carrot", "fox", "explorer" }; 

使用新的数组作为参数。

 string[] array = { "carrot", "fox", "explorer" }; List<string> list3 = new List<string>(array); 

在构造函数中使用容量并赋值。

 List<string> list4 = new List<string>(3); list4.Add(null); // Add empty references. (Not Recommended) list4.Add(null); list4.Add(null); list4[0] = "carrot"; // Assign those references. list4[1] = "fox"; list4[2] = "explorer"; 

对每个元素使用Add方法。

 List<string> list5 = new List<string>(); list5.Add("carrot"); list5.Add("fox"); list5.Add("explorer"); 

因此,对于对象列表,您可以使用List初始化内联分配和分配对象的属性。 对象初始化器和集合初始化器共享相似的语法。

 class Test { public int A { get; set; } public string B { get; set; } } 

用集合初始值设定项初始化列表。

 List<Test> list1 = new List<Test>() { new Test(){ A = 1, B = "Jessica"}, new Test(){ A = 2, B = "Mandy"} }; 

用新对象初始化列表。

 List<Test> list2 = new List<Test>(); list2.Add(new Test() { A = 3, B = "Sarah" }); list2.Add(new Test() { A = 4, B = "Melanie" }); 

使用通用列表(System.Collections.Generic.List)。