将Long Integer类型与集合方法一起使用

时间:2012-11-08 19:24:12

标签: c# collections long-integer

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

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

2 个答案:

答案 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,计数)