2011-01-30 28 views
0

我一直試圖在VB.NET中使用List(Of T),而不是由不能被別人命名的Robinson使用ArrayList。基本上,我需要存儲的是三件事:一個字符串,兩個整數,也許兩個布爾值。我喜歡使用ArrayList,因爲它將所有元素都視爲「對象」,所以我沒有真正遇到存儲各種元素的問題。性能提示列表

但是現在我一直在考慮使用List(Of T)。但是,我該如何保存我的各種元素?我一直在考慮讓Structure持有這五個元素。

聽起來像個好主意嗎?我聽說結構預計會有短暫的生命。但是我擔心,只要我的應用程序存在,我就會永遠擁有我的結構。這有什麼區別嗎?

最後,如果我需要創建......不知道...... 125,000,000個列表,每個列表包含一個結構?這是可能的(和好的)?

+1

異構集合通常只是一個愚蠢的想法,即使在動態語言。使用一個結構(或者,也許是類)。數組,ArrayLists,列表等都是存儲同一事物的0- *實例的集合,沒有別的。性能應該是你最不關心的問題。 – delnan 2011-01-30 22:45:34

回答

4

如果您正在使用集合類型(ArrayListList(Of T)),僅僅是因爲您正在尋找一個存儲固定數量完全不同類型的地方,請停止!你正在創建一個結構正確的軌道,但你正在尋找的是所謂的class

因爲,從你的其他問題,這聽起來像你正在創建一個地圖編輯器,我假設你的兩個數字是X和Y座標,我猜這個字符串是某種名稱?如果是這樣,很簡單:

Public Class Tile 
    Public Property Name as String 
    Public Property X as Integer 
    Public Property Y as Integer 
End Class 

(注意上面,如果你使用Visual Studio 2010和.NET 4才起作用;如果沒有,迴應,我會用一個預先-4兼容的版本編輯)

您會更容易參考.X.Y屬性,而不是僅僅在各處引發索引。這也將是很多更快(並佔用更少的內存)比這樣做。

我打算放棄所有內容的完整描述,因爲對什麼是類,什麼屬性很容易獲得。這有幫助嗎?

+0

我已經注意到了一件事......即使我使用一個類來存儲我的個人瓷磚信息,我仍然需要一個巨大的(我的意思是巨大的)2d陣列圖來排列我所有的瓷磚類,不是嗎? – Voldemort 2011-01-30 23:05:03

+0

@Omega:你爲什麼需要一個2d列表數組?看起來你需要一個2d的Tiles數組。 – 2011-01-30 23:24:28

1

我一定會放棄使用ArrayList。爲什麼?因爲從.NET 2.0版開始引入泛型,這是很久以前的事情,強類型List(Of T)已經在大多數實際應用中佔據了自己的位置。

即使你的情況,我會建議對一個ArrayList,因爲你可以有一個更好,也更容易,例如一個訪問的數據結構—如下所示:

Structure CompositeValue ' or declare this as Class instead; see comment below! 
    Public Property SomeString() As String 
    Public Property FirstInteger() As Integer 
    Public Property SecondInteger() As Integer 
    Public Property MaybeFirstBoolean() As Nullable(Of Boolean) 
    Public Property MaybeSecondBoolean() As Nullable(Of Boolean) 
End Structure 
' Note that the above is the syntax for auto properties, which were introduced 
' with VB.NET 10/VS 2010. 

優點:這方式,你不會記得例如在ArrayList的哪個位置有字符串或第二個整數值;編譯器將能夠確保您訪問您認爲正在訪問的屬性。此外,您的代碼將更容易閱讀和理解。


開始。NET 4,你也可以使用一個Tuple(Of String, Integer, Integer, Nullable(Of Boolean), Nullable(Of Boolean))

Dim myCompositeValue = Tuple.Create("Foo", 1, 2, True, False) 

但是,讓我說,元組不具有所有這些結構的優點,如上面的類結構;你會得到類型安全,但你不能爲這五個屬性給出明智的名稱。 VB.NET中的元組只不過是一組類型安全的匿名值。