声明后是否可以更改数组大小?如果没有,是否有任何替代阵列? 我不想创建一个大小为1000的数组,但是当我创建它时我不知道数组的大小。
不,尝试使用强类型的List。
例如:
而不是使用
int[] myArray = new int[2];
myArray[0] = 1;
myArray[1] = 2;
你可以这样做:
List<int> myList = new List<int>();
myList.Add(1);
myList.Add(2);
列表使用数组来存储数据,因此您可以通过添加和删除项目来获得数据的速度优势,方便的是LinkedList
,而无需手动更改其大小。
这并不意味着数组的大小(在这个例子中,List
)不会改变 - 因此手动强调单词。
一旦你的数组达到预定义的大小,JIT将在堆上分配一个大小两倍的新数组并复制你现有的数组。
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;
}
如果要添加/删除数据,请使用List(其中T是任何类型或对象),因为调整数组大小非常昂贵。您可以阅读有关Arrays considered somewhat harmful的更多信息,而可以添加List以将新记录添加到最后。它根据需要调整其大小。
List可以通过以下方式初始化
使用集合初始化程序。
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" });
这对我来说很适合从类数组创建动态数组。
var s = 0;
var songWriters = new SongWriterDetails[1];
foreach (var contributor in Contributors)
{
Array.Resize(ref songWriters, s++);
songWriters[s] = new SongWriterDetails();
songWriters[s].DisplayName = contributor.Name;
songWriters[s].PartyId = contributor.Id;
s++;
}
如果你不能使用Array.Reset
(变量不是本地的),那么Concat
和ToArray
有助于:
anObject.anArray.Concat(new string[] { newArrayItem }).ToArray();
如果你真的需要将它恢复到数组中,我发现将array
转换为list
最简单,展开列表然后将其转换回array
。
string[] myArray = new string[1] {"Element One"};
// Convert it to a list
List<string> resizeList = myArray.ToList();
// Add some elements
resizeList.Add("Element Two");
// Back to an array
myArray = resizeList.ToArray();
// myArray has grown to two elements.
使用通用List(System.Collections.Generic.List)。
您可以使用Array.Resize()
记录的MSDN。
但是,我同意Corey,如果你需要一个动态大小的数据结构,我们有List
s。
重要提示:Array.Resize()
不会调整数组大小(方法名称具有误导性),它会创建一个新数组,并且只替换传递给方法的reference。
一个例子:
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()
。此方法分配具有指定大小的新数组,将旧数组中的元素复制到新数组,然后用新数组替换旧数组。 (所以你需要两个数组都可用的内存,因为这可能会使用Array.Copy
)
请改用List<T>
。例如,而不是一组int
private int[] _myIntegers = new int[1000];
使用
private List<int> _myIntegers = new List<int>();
后来
_myIntegers.Add(1);
在C#中,无法动态调整数组大小。
System.Collections.ArrayList
而不是native array
。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]);
}
将此方法用于字节数组:
原来:
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()
在C#中,Array.Resize
是将任何数组调整为新大小的最简单方法,例如:
Array.Resize<LinkButton>(ref area, size);
在这里,我想调整LinkButton数组的数组大小:
<LinkButton>
=指定数组类型
ref area
= ref是一个关键字,'area'是数组名称
size
=新的大小数组
是的,可以调整阵列的大小。例如:
int[] arr = new int[5];
// increase size to 10
Array.Resize(ref arr, 10);
// decrease size to 3
Array.Resize(ref arr, 3);
如果使用CreateInstance()方法创建数组,则Resize()方法不起作用。例如:
// create an integer array with size of 5
var arr = Array.CreateInstance(typeof(int), 5);
// this not work
Array.Resize(ref arr, 10);
数组大小不是动态的,即使我们可以调整它的大小。如果你想要一个动态数组,我想我们可以使用通用List。
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);
}