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
(这很昂贵)。或者,使用构造