2012-11-08 89 views
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
+3

「List」中實際有多少項? – Servy

+0

@Servy足夠的'i​​nt'太小的類型使用。 – kevin628

+0

那麼它是40億,90億,10萬億? 'int.MaxValue'和'long.MaxValue'之間的空格是* lot *,可能會影響答案。 – Servy

回答

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

0

如果有一種方式,你可以組類似的物品放在一起,你能不能把總向下跌破限制?例如。如果您的數據包含大量重複的X,Y座標,則可以通過創建頻率計數字段來減少元素數量並保留一個列表。例如(x,y,count)