我遇到了一个问题,最好用这段代码说明:
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
。答案 0 :(得分: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
答案 1 :(得分:0)
如果有一种方法可以将类似物品组合在一起,你能否将总数降到极限以下?例如。如果您的数据包含大量重复的X,Y坐标,您可以通过创建频率计数字段来减少元素数量并保留一个列表。例如(X,Y,计数)