2012-06-01 54 views
0

背景:我試圖創建自己的「矢量」類,以協助對號碼組進行數學計算。我正在重載算術運算符(+ - * /)以實現我想要的功能。起初,我在我的班級中使用了一個私有數組,然後實現了接口。之後,我想到繼承List<T>課程,但在閱讀了幾篇文章後,我明白我應該使用Collection<T>來代替。請注意,當使用數據填充我的「Vector」對象時,的性能非常重要System.Collections.ObjectModel.Collection <T>的「Add」方法是如何工作的?

問題:Collection<T>.Add()方法是如何工作的?所述List<T>.Add()documentation是很清楚的:

如果計數已等於容量,列表的容量增加自動重新分配內部陣列,而現有的元素被複制到新的陣列被添加的新元素之前。

但是,Collection<T>.Add()documentation根本沒有說明它是如何工作的。當我使用List<T>作爲我的基類時,我可以訪問Capacity屬性,並且我可以在使用Add()方法之前指定大小。但是,Collection<T>沒有Capacity屬性---這就是爲什麼我問這個問題。我再次重申:表現非常重要。

由於性能是一個問題,也許我應該回去使用專用陣列和實施IEnumerable<T>接口。你怎麼看?

+1

我可以建議不要自己滾動嗎?請參閱[在C#中使用3D數學的好庫]?(http://stackoverflow.com/questions/607254/good-library-for-3d-math-in-c) – bluevector

+0

這可能會有幫助,雖然它沒有涉及直接收集:http://c-sharp-snippets.blogspot.co.uk/2010/03/runtime-complexity-of-net-generic.html –

+0

@dtryon感謝您的鏈接......正如您指出的那樣並不能幫助我解決我的問題,但這是一個很好的參考,我一定會在將來使用。 – HydroPowerDeveloper

回答

4

一個Collection<T>是圍繞IList<T>的包裝。的Collection<T>默認構造函數只是採用了全新的List<T>,所以Add行爲將作爲List<T>假設你使用默認的構造函數相同。

然而,Collection.Add()文件說什麼都沒有它是如何工作

這是因爲Add行爲取決於底層IList,這是在構造函數中傳遞。

但是,本身並不具有容量性質

再次,因爲這將取決於哪些集合包裝。它包裝了接口IList<T>。界面沒有容量的概念。有可能IList<T>的實現,沒有一個已知的能力,像數據庫中的記錄。

如果你需要這些實施細節,如能力,那麼就使用一個List<T>Collection<T>List<T>相比沒有任何性能優勢,因爲它無論如何都使用它。如果性能對你至關重要,那麼你可能希望找到一個已經解決了這個問題的庫,而不是自己動手。

+0

感謝您的回答......我可以在哪裏找到/訪問Capacity屬性? – HydroPowerDeveloper

+0

+1。請注意,此行爲會使Collection.Add方法中設置的性能期望值無效... –

+0

@HydroPowerDeveloper請參閱編輯。 – vcsjones

2

上有沒有實施細節,但性能特性添加的文檔中:

List<T>.Add

如果計數小於容量,此方法是一個O(1)操作。如果需要增加容量以適應新元素,則此方法變爲O(n)操作,其中n爲Count。

Collection<T>.Add(作爲2012-06-01)

此方法是O(1)的操作。

注意,對於Collection<T>.Add保證不看的權利在作爲要爲集合()來實現徵收List<T>或使用默認的構造函數創建的包裝至少集合:這(新名單())作爲@vcsjones指出出。看起來像文檔中的錯誤。

它應該很容易通過測量(這是解決性能問題的正確方法),或在來源嗅來驗證...

旁註:您將無法使用單擊敗列表中的添加表現數組(正如List所做的那樣),你需要使用更復雜的東西(比如數組塊的列表)來從Add和Item []中獲得O(1)。

+0

我感謝您的意見,特別是您的「旁註」。但是,文檔(您引用的)對我來說有點混亂。如果Collection 正在包裝List ,則Add()方法如果超過容量,則不能是O(1)操作。這種理解是正確的嗎? – HydroPowerDeveloper

+0

所以我也很困惑。絕對在包裝的情況下,列表添加的性能將相同(O(1)/ O(n)超過容量)。我不知道Collection在IList 參數初始化時使用了什麼。 –

+0

根據tryon的鏈接,LinkedList「添加容量」具有O(1)性能......這是有道理的,因爲(我假設)每個元素都是動態創建的。我不認爲Collection 的行爲像LinkedList(另外,LinkedList沒有實現IList)。我想知道文檔中是否有錯誤。 – HydroPowerDeveloper

相關問題