关于c#中数组和列表的问题

时间:2013-10-22 12:10:53

标签: c# arrays performance list collections

我一般都不是在询问数组和列表之间的区别,我只想询问它们在这种情况下的区别。

我有一个数组。数组索引是一个动态值,我有一个整数List。

int DynamicValue=20 ;//It's any values should be coming from database or anywhere 

int[DynamicValue] array1=new int[DynamicValue];//Array declaration

List<int> list1=New List<int>();//List declaration 

现在我创建一个for循环来向Array和List添加值:

//首先在数组中添加值

for(i=0;i<DynamicValue;i++)
{
  array1[i]=i;
}

//然后将值添加到列表

for(i=0;i<DynamicValue;i++)
{
  list1.Add(i);
}

现在上述代码有什么区别?

我的问题是:

  1. Array是类型安全的,并且还定义了索引大小。那么为什么许多人喜欢这种情况下的列表呢? (我知道它对于泛型编码很有用,但我要求这种情况)
  2. 数组for循环没有产生任何装箱和拆箱,那么为什么我们需要List呢?
  3. 在此方案中哪个for循环(数组或列表)最佳
  4. 哪个for循环会提供良好的性能(我认为两个for循环都很好,因为此代码不会尝试任何装箱和拆箱,而且这些代码也是类型安全的。但我是目前还不确定哪一个更好?)

1 个答案:

答案 0 :(得分:2)

创建阵列时,请指定大小。当您创建列表时,您没有(您可以提供构造函数重载的初始容量)。

因此,当您创建数组时,您说它需要20个int对象大小的内存。但是当你创建List时,它没有为整数保留大小。

List<int> list = new List<int>();
Console.WriteLine(list.Capacity);
//Output: 0

然后,当您使用循环向数组添加项目时,数组的大小仍为20.但是当您使用循环列表时,列表看到没有空间。因此它为4个项目创建了空间(检查list.Capacity在首次添加后)。然后,当容量已满时,列表将使其容量翻倍。现在它是8.然后再次16,然后再次32.所以最后你的列表在内存中为32个int对象保留了空间。

这个数组只保留了20个,所以整个数组的内存更好。

此外,性能方面,阵列也快一点。我指的是这个答案:https://stackoverflow.com/a/454923/637425


要解决您的一些问题:

  1. 很多人不喜欢使用索引。你很容易犯错误(特别是对于初学程序员来说)。索引是基于零的等等...但是如果你可以只调用.Add(),你不必担心索引。因此,大多数人使用List
  2. 会有一些方便
  3. 您不需要列表...请参阅答案1.
  4. 看我的大故事......数组记忆力更好。
  5. 两者都表现良好,你不会注意到任何差异。当您开始使用更大的列表/数组时,它变得有趣。对于大小为20的东西,性能没有太大提升。