改变数组大小
声明后可以更改数组大小吗? 如果没有,是否有任何替代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);
在这里,我想调整LinkButton数组的大小:
<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)。