【问题标题】:Questions about Array and List in c# [duplicate]c#中关于数组和列表的问题[重复]
【发布时间】:2013-10-31 07:14:59
【问题描述】:

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

我有一个数组。数组索引是动态值,我有一个整数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 循环来向数组和列表添加值:

//先在数组中添加值

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

//然后将值添加到列表中

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

现在上面的代码有什么区别?

我的问题是:

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

【问题讨论】:

  • @Mansfield 感谢您的编辑先生!
  • 没问题。我知道您想保持礼貌,但尽量避免添加太多与下次问题无关的信息 - 当它变得混乱时,人们更有可能因为无法理解而关闭 - 即使这是个好问题!
  • 他们确实有你的场景。您可以将该问题中解释的所有要点应用于任何场景。在接受的答案中,这一行回答了您的情况:“如果您知道数据是固定长度的,并且您想出于某些非常具体的原因进行微优化(基准测试后),那么数组可能有用”。重点是 - 您将在 数据库调用 之后填充您的数组或列表,这将需要数十甚至数百毫秒才能完成。如果在那之后你花一微秒来初始化你的数组,或者两微秒来初始化你的列表,这真的无关紧要了。
  • 关于“装箱和拆箱”,这不会发生,因为与 java 不同,C# 可以在值类型上有泛型。
  • 那部分没有包含在副本中,所以我想我至少会回答这个问题。

标签: c# arrays performance list collections


【解决方案1】:

创建数组时,您指定大小。当您创建列表时,您不会(您可以通过构造函数的重载来提供初始容量)。

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

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

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

该数组只保留了 20 个,因此总体而言该数组在内存方面更好。

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


解决您的一些问题:

  1. 许多人不喜欢使用索引。你很容易犯错(尤其是对于初学者来说)。索引是从零开始的等等......但是如果你可以打电话给.Add(),你就不必担心索引。所以大部分人用List还是有点方便的
  2. 您不需要列表...参见答案 1。
  3. 看我的大故事...数组在内存方面要好一些。
  4. 两者都提供良好的性能,您不会注意到任何差异。当您开始使用更大的列表/数组时,它就会变得有趣。对于大小为 20 的东西,性能提升并不大。

【讨论】:

  • 谢谢你的回答,我明白了!!
  • @RameshRajendran 在编辑中解决了所有问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2020-07-23
相关资源
最近更新 更多