Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除列表中计数和容量之间的距离_C# - Fatal编程技术网

C# 删除列表中计数和容量之间的距离

C# 删除列表中计数和容量之间的距离,c#,C#,我已经创建了一个列表并为列表赋值 List<int> array = Enumerable.Repeat(0, max).ToList(); List array=Enumerable.Repeat(0,max.ToList(); 最终输出是正确的。但列表中的两个标准(计数和容量)彼此不同 例如:容量为2048,计数为1559。为什么? 如何消除这种距离?容量是列表在需要调整大小之前可以存储的元素数,而计数是列表中实际存在的元素数 容量始终大于或等于计数。如果添加元素时计数超过容

我已经创建了一个列表并为列表赋值

List<int> array = Enumerable.Repeat(0, max).ToList();
List array=Enumerable.Repeat(0,max.ToList();
最终输出是正确的。但列表中的两个标准(计数和容量)彼此不同

例如:容量为2048,计数为1559。为什么?


如何消除这种距离?

容量是列表在需要调整大小之前可以存储的元素数,而计数是列表中实际存在的元素数


容量始终大于或等于计数。如果添加元素时计数超过容量,则在复制旧元素并添加新元素之前自动重新分配内部数组,从而增加容量。

容量是列表在需要调整大小之前可以存储的元素数,而Count是列表中实际存在的元素数


容量始终大于或等于计数。如果在添加元素时计数超过容量,则在复制旧元素并添加新元素之前,通过自动重新分配内部阵列来增加容量。

您可以参考Bursac Milan以获取解释

关于这个问题:

如何消除这种距离

您可以通过创建自己的初始容量列表来修复容量,如下所示:

var list = new List<int>(max);
list.AddRange(Enumerable.Repeat(0, max));
var列表=新列表(最大值);
list.AddRange(可枚举。重复(0,最大值));

您可以向米兰法萨克咨询解释

关于这个问题:

如何消除这种距离

您可以通过创建自己的初始容量列表来修复容量,如下所示:

var list = new List<int>(max);
list.AddRange(Enumerable.Repeat(0, max));
var列表=新列表(最大值);
list.AddRange(可枚举。重复(0,最大值));

基本上,您想要使用的是

将容量设置为列表中元素的实际数量(如果该数量小于阈值)

如果不向集合中添加新元素,则可以使用此方法最小化集合的内存开销。然而,重新分配和复制大型列表的成本可能相当大,因此如果列表的容量超过90%,TrimOverse方法将一事无成。这避免了为相对较小的收益而产生较大的重新分配成本


基本上你想用的是

将容量设置为列表中元素的实际数量(如果该数量小于阈值)

如果不向集合中添加新元素,则可以使用此方法最小化集合的内存开销。然而,重新分配和复制大型列表的成本可能相当大,因此如果列表的容量超过90%,TrimOverse方法将一事无成。这避免了为相对较小的收益而产生较大的重新分配成本


这是由于
列表
的实现方式造成的。让整个事情变得更糟,
List
有一个私有数组变量,它保存您添加的所有项。现在,阵列的大小是固定的。因此,MS一开始的最小尺寸为4。这是您的初始数组大小。所以,下面这行代码在内部创建了一个大小为4的数组

List<int> test = new List<int>();
// internally
int[] _items = new int[4];
List test=newlist();
//内部
int[]_items=新int[4];
当我们开始添加项时,List类内部计算其内部数组是否足够大。当在上面的列表中添加第5个元素时,它显然无法将其存储在数组中。因此,它创建了一个新数组并将所有内容复制到那里。新的数组大小是根据名为
EnsureCapacity
List
类中的私有方法确定的。类发送它
当前数组大小+1
,在本例中为5。然后,此方法在内部将数字加倍,并创建一个新数组。因此将创建一个大小为8的新数组。第9项变成16项,以此类推

这将一直持续到达到2GB标记(在.Net中最大对象大小)

虽然拥有比列表大小更大的容量没有坏处,但如果您正在处理内存敏感的应用程序,您可以在确定不会添加新项目时调用
trimOverse
(这很昂贵)。或者,使用构造函数自己设置容量


有一件事让我感到困惑,那就是
ToList
扩展方法调用
List
构造函数,并将
IEnumerable
作为参数。此构造函数声称容量将与给定的集合大小相同,但事实并非如此。

这是由于
列表的实现方式造成的。让整个事情变得更糟,
List
有一个私有数组变量,它保存您添加的所有项。现在,阵列的大小是固定的。因此,MS一开始的最小尺寸为4。这是您的初始数组大小。所以,下面这行代码在内部创建了一个大小为4的数组

List<int> test = new List<int>();
// internally
int[] _items = new int[4];
List test=newlist();
//内部
int[]_items=新int[4];
当我们开始添加项时,List类内部计算其内部数组是否足够大。当在上面的列表中添加第5个元素时,它显然无法将其存储在数组中。因此,它创建了一个新数组并将所有内容复制到那里。新的数组大小是根据名为
EnsureCapacity
List
类中的私有方法确定的。类发送它
当前数组大小+1
,在本例中为5。然后,此方法在内部将数字加倍,并创建一个新数组。因此将创建一个大小为8的新数组。第9项变成16项,以此类推

这将一直持续到达到2GB标记(在.Net中最大对象大小)

虽然拥有比列表大小更大的容量没有坏处,但如果您正在处理内存敏感的应用程序,您可以在确定不会添加新项目时调用
trimOverse
(这很昂贵)。或者,使用构造