c# - C# 中的列表大小限制

标签 c# list

这可能看起来是一个令人讨厌的问题 但是为什么列表中的对象数量限制这么短。

我在 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/

相关文章:

c# - 如何使用 C# 覆盖默认的 css 类

c# - HTML:使用 C# Razor 和模型的复选框

c - c中的段错误

list - Lisp 列表中的不完整输出,# 给出的列表深度超过 4

c# - 如何在 Windows 应用程序中使用 Windows 身份验证?

c# - SQL如何将两个日期之间一小时内的事件求和并显示在一行中

c# - DebuggerDisplay 在运行时解析为字符串

r - 提取列表元素并连接成 r 中的字符串

python - 如何创建动态 Django 选择字段

r - 对路径列表中的栅格进行分组/堆叠,并提取每组的最小值