2011-01-30 53 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中的元组只不过是一组类型安全的匿名值。