3

假设我们有一个长度非常大的字符串,甚至比 max_int 还要大。

string str="this should contain a long string";

如果我想到达str[100000000000].

我该怎么做?

当我尝试放置其类型不是 int 的索引时,我收到以下错误:

'string.this[int]' 的最佳重载方法匹配有一些无效参数

4

4 回答 4

3

你不能。我不相信你可以拥有一个占用超过 2^32 字节的对象,所以你真的不会遇到这个。

根据这篇文章,最大 CLR 对象大小为 2GB,这证实了我的说法。

于 2012-10-18T02:30:30.457 回答
2

在 .NET 4.5 之前,单个对象的最大大小为 2GB,因此您永远不可能拥有这么大的字符串,因此尝试使用这么大的索引没有任何意义。


在 .NET 4.5 中,您可以增加该限制。引用MSDN

“默认情况下,当您在 64 位 Windows 操作系统上运行 64 位托管应用程序时,您可以创建不超过 2 GB 的对象。但是,在 .NET Framework 4.5 中,您可以增加这个限制。有关更多信息,请参阅gcAllowVeryLargeObjects元素。”

但是,大多数容器仍然具有基于数组的接口int,甚至对于数组,这也无济于事......

“数组中元素的最大数量是UInt32MaxValue。”

...这是 4,294,967,295,仍然小于您建议的 100,000,000,000。


你真的需要有那么多连续的记忆吗?为什么不将数据拆分为更小的块?

于 2012-10-18T02:45:22.770 回答
1

您需要实现支持大范围索引的自定义数组。

所有普通的 .Net 类型(如字符串、数组、列表)仅支持用于索引的整数。这部分是由于对最大连续分配大小的限制 - 因此您的自定义类需要分块数据以支持此类索引。

于 2012-10-18T02:32:16.100 回答
1

您可以使用Array.GetValue来获取大于的数组索引int

于 2012-10-18T02:34:06.833 回答