这可能看起来是一个令人讨厌的问题 但是为什么列表中的对象数量限制这么短。
我在 C# 中编写了以下代码来测试列表大小
List<int> test = new List<int>();
long test1 = 0;
try
{
while (true)
{
test.Add(1);
test1++;
}
}
catch (Exception ex)
{
MessageBox.Show(test1 + " | " + ex.Message);
}
列表的大小只能是134217728
这不是不公平吗 :( ??? 如果我想添加甚至超出“整数”限制的对象(我的意思是对象数 > 2^32),还有什么替代方法???
最佳答案
A List<int>
由 int[]
支持.一旦无法分配更大的后备阵列,您就会失败 - 请记住:
- 即使在 64 位中,CLR 中也有每个对象 2GB 的限制(编辑:从 .NET 4.5 开始,64 位 CLR 可以避免这种情况 - 请参阅
<gcAllowVeryLargeObjects>
) - 该列表将尝试分配一个比它立即需要的更大的后备数组,以便稍后容纳
Add
。无需重新分配的请求。 - 在重新分配期间,必须有足够的总内存用于旧数组和新数组。
设置 Capacity
将支持阵列置于理论极限附近的值可能会使您获得比自然增长更高的截止点,但该极限肯定会到来。
我期望限制在大约 229 个元素 (536,870,912) - 我有点惊讶你没有设法超过 134,217,728。你实际有多少内存?您使用的是什么版本的 .NET,在什么架构上? (对于 32 位 CLR,每个对象的限制可能是 1GB,我记不太清了。)
请注意,即使每个对象的限制不是问题,一旦超过 231 个元素,您就会遇到直接寻址这些元素的问题与 List<T>
,因为索引器采用 int
值(value)。
基本上,如果你想要一个超过 int.MaxValue
的集合元素,您需要自己编写,可能使用多个后备数组。您可能想要明确禁止删除和任意插入:)
关于c# - C# 中的列表大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7885294/