为什么List <T>(Int32)的.Count的初始大小为0?

朱利安

今天,您好我绊了与事List<T>(Int32)我认为以下示例中的行为将是相同的:

1。

var myList = new List<string>(5);
myList[1] = string.Empty;

2。

var myArray= new string[5];
myArray[1] = string.Empty;

第一个示例失败,并且我得到一个'System.ArgumentOutOfRangeException'。第二个示例效果很好。

因此,我尝试.Count在列表中将其设置为0,就像在放置.Length数组时将其显示为5一样。

在MSDN中它说:

初始化List类的新实例,该实例为空并具有指定的初始容量。

我以为这意味着列表具有我传入的初始大小。为什么不这样呢?

提前致谢!

MatíasFidemraizer

初始容量是指列表维护的内部阵列存储。

如果您希望容纳100个项目,并指定100作为初始容量,则可以避免数组内部调整大小的开销(嗯,实际上,该列表避免了创建新数组并复制上一个数组的值...)。

也许现在您已经意识到列表(以及许多其他集合类型)只是提供特定语义的数组的抽象:列表,集合,字典...

例如,具有100初始容量的项目的列表集合可能会将项目添加到已经具有100索引/槽的内部阵列中

int[] array1 = new int[100];
array1[0] = 1;
// until...
array1[99] = 2;

...虽然容量不佳,但可能需要以这种方式在内部处理100件物品的插入:

int[] array2 = new int[3];
array2[0] = 1;
array2[1] = 2;
array2[2] = 3;

int[] array3 = new int[6];
array2.CopyTo(array3);
array3[3] = 4;
array3[4] = 5;
array3[5] = 6;

int[] array4 = new int[9];
array3.CopyTo(array4);
array4[6] = 7;
array4[7] = 8;
array4[8] = 9;
// and so on...

整个内部数组(作为列表的存储)已经做了最小限度的保留,但这只是实现细节。如果您已经知道要添加到列表中的项目数,则最好提供初始容量。

请注意,初始容量并不能确定整个列表的最大容量。这会损害列出的目的和语义:对象的集合下令插入顺序(FIFO,先入先出)。达到容量后,将重新调整内部阵列的大小。

另外,由于较高级别的列表仅被描述为对象集合,因此不能指望提供初始容量可以提供对内部存储索引的访问。有一个内部数组存储集合对象的事实是一个实现细节,您需要依赖高级细节:

// Above reason is why you CAN'T access myList[1]
var myList = new List<string>(5);
myList[1] = string.Empty;

更多详细信息

希望现在大多数.NET Framework源代码都可以在线获得。您可以看一下List<T>源代码,以检查一下它在内部的工作方式:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么此Int32总和总是返回0?

来自分类Dev

为什么int32 / int64比int慢?

来自分类Dev

为什么存在Convert.ToInt32(Int32)?

来自分类Dev

List <T>构造函数(IEnumerable <T>)不接受从Array.CreateInstance(Type,Int32)创建的数组

来自分类Dev

为什么Color在字节上使用Int32?

来自分类Dev

为什么List(Of T)没有Count()?

来自分类Dev

为什么要检查List <T> .Count <= 0?

来自分类Dev

为什么当int64_t更改为int32_t时类的大小会增加

来自分类Dev

使用UpdateRange(IEnumerable <T>)时,可以利用List <T>函数Remove(T)和Insert(Int32,T)的优势吗?

来自分类Dev

无法使用类型为“(Int32?)”的参数列表调用类型“UnsafeMutablePointer<Int32>”的初始化程序

来自分类Dev

在C#中将Int32转换为T并将T []转换为Int32 []

来自分类Dev

__int32 vs int vs int32_t之间的区别(再次)

来自分类Dev

为什么Convert.ToInt32(1.0 / 0.00004)!=(Int32)(1.0 / 0.00004)

来自分类Dev

为什么golang中的符文是int32而不是uint32的别名?

来自分类Dev

为什么`Int32`在其源代码中使用`int`?

来自分类Dev

在switch语句中初始化变量(int32)

来自分类Dev

“ TypeError:“ ResourceApplyAdagradDA”操作的输入“ global_step”的类型为int32的类型与预期的int64类型不匹配。” 这是什么错误?

来自分类Dev

C#List <T> RemoveAt(int32)函数删除2d列表中每个列表的所有索引,而不仅仅是指定的列表

来自分类Dev

在Swift中要为int32 pixelFormat输入什么?

来自分类Dev

什么是int32的快速理想哈希函数?

来自分类Dev

Windows应用商店-ApplicationDataCompositeValue Int32值为null

来自分类Dev

UInt32,Int32和Float32的字节类型是什么?

来自分类Dev

为什么我们不能使用GetConstructor找到Int32的默认构造函数?

来自分类Dev

为什么&运算符返回Int32而不是bool?

来自分类Dev

LINQ to Entities无法识别方法'Int32 Parse(System.String)'为什么?

来自分类Dev

为什么不能将Action <Int32>强制转换为Action <Object>?

来自分类Dev

当转换为Int32时,为什么字节的ASCII值不同?

来自分类Dev

为什么&运算符返回Int32而不是bool?

来自分类Dev

为什么float64允许NA,但int32不允许?

Related 相关文章

  1. 1

    为什么此Int32总和总是返回0?

  2. 2

    为什么int32 / int64比int慢?

  3. 3

    为什么存在Convert.ToInt32(Int32)?

  4. 4

    List <T>构造函数(IEnumerable <T>)不接受从Array.CreateInstance(Type,Int32)创建的数组

  5. 5

    为什么Color在字节上使用Int32?

  6. 6

    为什么List(Of T)没有Count()?

  7. 7

    为什么要检查List <T> .Count <= 0?

  8. 8

    为什么当int64_t更改为int32_t时类的大小会增加

  9. 9

    使用UpdateRange(IEnumerable <T>)时,可以利用List <T>函数Remove(T)和Insert(Int32,T)的优势吗?

  10. 10

    无法使用类型为“(Int32?)”的参数列表调用类型“UnsafeMutablePointer<Int32>”的初始化程序

  11. 11

    在C#中将Int32转换为T并将T []转换为Int32 []

  12. 12

    __int32 vs int vs int32_t之间的区别(再次)

  13. 13

    为什么Convert.ToInt32(1.0 / 0.00004)!=(Int32)(1.0 / 0.00004)

  14. 14

    为什么golang中的符文是int32而不是uint32的别名?

  15. 15

    为什么`Int32`在其源代码中使用`int`?

  16. 16

    在switch语句中初始化变量(int32)

  17. 17

    “ TypeError:“ ResourceApplyAdagradDA”操作的输入“ global_step”的类型为int32的类型与预期的int64类型不匹配。” 这是什么错误?

  18. 18

    C#List <T> RemoveAt(int32)函数删除2d列表中每个列表的所有索引,而不仅仅是指定的列表

  19. 19

    在Swift中要为int32 pixelFormat输入什么?

  20. 20

    什么是int32的快速理想哈希函数?

  21. 21

    Windows应用商店-ApplicationDataCompositeValue Int32值为null

  22. 22

    UInt32,Int32和Float32的字节类型是什么?

  23. 23

    为什么我们不能使用GetConstructor找到Int32的默认构造函数?

  24. 24

    为什么&运算符返回Int32而不是bool?

  25. 25

    LINQ to Entities无法识别方法'Int32 Parse(System.String)'为什么?

  26. 26

    为什么不能将Action <Int32>强制转换为Action <Object>?

  27. 27

    当转换为Int32时,为什么字节的ASCII值不同?

  28. 28

    为什么&运算符返回Int32而不是bool?

  29. 29

    为什么float64允许NA,但int32不允许?

热门标签

归档