0

我遇到了一个问题,最好用这个代码段来说明:

public static void Foo(long RemoveLocation) 
{
    // Code body here...

    // MyList is a List type collection object.
    MyList.RemoveAt(RemoveLocation);
}

问题:RemoveLocation 是一个long. RemoveAt 方法只接受int类型。我该如何解决这个问题?

我宁愿避免的解决方案(因为这是项目的关键时间):

  • 拆分MyList成两个或多个列表;这将需要重写大量代码。
  • 使用int而不是long.
4

2 回答 2

0

理论上,一个列表中元素的最大数量是int.MaxValue,大约是 20 亿。

但是,使用列表类型来存储数量极大的元素是非常低效的。它根本就不是为此而设计的,而您使用树状数据结构做得更好。

例如,如果您查看 Mono 的列表类型实现,您会发现它们使用单​​个数组来保存元素,我假设 .NET 的版本也是如此。由于 .NET 中元素的最大大小为 2 GB,因此实际最大元素数为 20 亿除以元素大小。因此,例如,64 位机器上的字符串列表最多可以包含大约 2.68 亿个元素。

当使用可变(非只读)列表类型时,在添加项目时需要将该数组重新分配到更大的大小(通常使用旧大小的两倍),从而需要复制整个内容。这是非常低效的。

除此之外,拥有太大的对象也会对垃圾收集器产生负面影响。

更新

如果您真的需要一个非常大的列表,您可以简单地编写自己的数据类型,例如使用数组或大型数组作为内部存储。

这里也有一些有用的评论:http: //blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx

于 2012-11-08T20:52:14.660 回答
0

如果有一种方法可以将相似的项目组合在一起,你能否将总数降低到限制以下?例如,如果您的数据包含大量重复的 X、Y 坐标,您可以通过创建频率计数字段来减少元素数量并仍然保留一个列表。例如(x,y,计数)

于 2012-11-08T21:05:34.850 回答