C#中的动态数组

135
在C#中是否有创建动态数组的方法?

1
如果你还在使用旧的[]而不是List<>,那么你可以使用Array.Resize()。这里有一个很好的例子:https://www.dotnetperls.com/array-resize - Gian
dotnetperls.com/array-resize 这个链接无法访问。(供参考) - Su Llewellyn
为什么不使用列表呢? - zahrakhani
9个回答

162

18
这个问题(虽然简短并且不够具体)并没有在问一个通用列表 - 这个问题可能在询问关于 dynamic[] https://msdn.microsoft.com/zh-cn/library/dd264736.aspx(动态类型的数组)或者 ExpandoObject https://msdn.microsoft.com/zh-cn/library/system.dynamic.expandoobject(v=vs.110).aspx。我可以因为没有提到这些而将回答评分为-1。 - Luke T O'Brien
8
在C# 4.0中引入了动态特性,这个问题最初被提出的一年后才发布。原帖作者可能在询问可调整大小的数据结构,比如https://en.wikipedia.org/wiki/Dynamic_array。 - Brian Merrell
10
只提供文章链接作为答案是没有帮助的。链接可能会失效,不能保证一直可用。请简明扼要地回答问题。 - JamEngulfer
它甚至没有提到List<T>。它只是一个(脆弱的)链接。而且说“看一下泛型列表”就足够在谷歌上搜索了,但是搜索结果只会把你带回这里。第二个回答给出了代码示例和解释,而不是懒惰地提供链接,因此更有价值。如果你想知道我为什么现在才评论这个问题,那是因为我需要查找参考资料,并遇到了与三年前相同的烦恼。 - JamEngulfer
1
@JamEngulfer,“如果你想知道为什么我现在发表评论,那是因为我需要查一下参考资料,而且遇到了三年前同样的烦恼”--哈,说得好。 - Lynn Crumbling
显示剩余3条评论

99

结合Chris和Migol的回答,附上代码示例。

使用数组

Student[] array = new Student[2];
array[0] = new Student("bob");
array[1] = new Student("joe");

使用泛型列表。List<T>类在内部使用数组进行存储,但是以一种使其能够高效增长的方式进行存储。

List<Student> list = new List<Student>();
list.Add(new Student("bob"));
list.Add(new Student("joe"));
Student joe = list[1];

2
这个例子有点糟糕,因为我们都谈到了ArrayList。 - Migol
27
这个答案比你的@Migol好,因为它展示了如何实际使用List<>而不仅仅将其作为关键字提及。"半坏"-> "半好" -> 好 - fhugas

69

有时候普通数组比泛型列表更受欢迎,因为它们更方便(例如用于数值代数应用程序的更好性能,或与统计软件如R或Matlab交换数据)

在这种情况下,您可以在动态初始化列表后使用ToArray()方法。

List<string> list = new List<string>();
list.Add("one");
list.Add("two");
list.Add("three");

string[] array = list.ToArray();
当然,这仅在数组的大小从未知且不固定时才有意义。如果您在程序的某个点上已经知道了数组的大小,最好将其初始化为固定长度的数组。(例如,如果您从ResultSet检索数据,则可以计算其大小并初始化该大小的数组,动态地)

1
不值得,只要你使用索引器。 - aaimnr
3
Array并不更加方便(因为它们提供了List<T>接口的一个子集),并且与List<T>相比几乎具有相同的性能,因为List<T>在底层使用常规数组。对6000000个元素进行迭代: List/for: 1971毫秒 Array/for: 1864毫秒(来自https://dev59.com/NHRB5IYBdhLWcg3w9L3n的基准测试) - aaimnr
11
如果您必须将数组传递给接口,那么它必须是一个数组。最好先构建列表,然后在传递之前将其转换为数组。我喜欢这个答案,因为它解决了问题! - Michael Stimson
动态创建数组与创建动态数组并不相同。 - jarmanso7

37

List<T> 是一个强类型的集合,如果你使用的是.NET 1.1或者喜欢进行变量转换,可以考虑使用 ArrayList


6

您可以使用动态对象来实现这一点:

var dynamicKeyValueArray = new[] { new {Key = "K1", Value = 10}, new {Key = "K2", Value = 5} };

foreach(var keyvalue in dynamicKeyValueArray)
{
    Console.Log(keyvalue.Key);
    Console.Log(keyvalue.Value);
}

2
使用实际上是数组的 数组列表。它最初采用大小为 4 的数组,当它被填满时,会创建一个新的数组,其大小加倍,并将第一个数组的数据复制到第二个数组中,然后将新项插入新数组。 此外,第二个数组的名称创建了第一个数组的别名,因此可以通过与先前相同的名称访问它,而第一个数组则被处理。

1

Dynamic Array Example:

Console.WriteLine("Define Array Size? ");
int number = Convert.ToInt32(Console.ReadLine());

Console.WriteLine("Enter numbers:\n");
int[] arr = new int[number];

for (int i = 0; i < number; i++)
{
    arr[i] = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0; i < arr.Length; i++ )
{
    Console.WriteLine("Array Index: "+i + " AND Array Item: " + arr[i].ToString());
}
Console.ReadKey();

这个答案中的数组没有任何动态性。 - Paul Childs

1
你可以使用来自集合类的ArrayList对象。
using System.Collections;

static void Main()
{
  ArrayList arr = new ArrayList();
}

当您想要添加元素时,可以使用:


arr.Add();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接