【问题标题】:Using Long Integer types with collection methods将 Long Integer 类型与集合方法一起使用
【发布时间】:2012-11-08 19:24:12
【问题描述】:

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

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

【问题讨论】:

  • List 中实际有多少项?
  • @Servy 够了,int 的类型太小而无法使用。
  • 那么是 40 亿、90 亿、10 万亿吗? int.MaxValuelong.MaxValue 之间的空格是很多,可能会影响答案。
  • .NET List 类最多只支持int 的项目...stackoverflow.com/questions/3906891/…
  • @nekizalb 废话。不过,很高兴知道这一点。谢谢!

标签: c# collections long-integer


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    理论上,一个列表的最大元素个数是int.MaxValue,也就是20亿左右。

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

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

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

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

    更新

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 2018-04-15
      相关资源
      最近更新 更多