VB.NET 动态多维集合

VB.NET dynamic multi dimensional collections

提问人:sickboy 提问时间:7/1/2023 最后编辑:sickboy 更新时间:7/5/2023 访问量:104

问:

你们中的某个人可能知道我是 vb.net 的初学者,所以我会问你一个建议。

在 VBA 中(我知道这是一种完全不同的语言),我的解决方法通常包括数组,我可以在代码中间编辑它们,例如

Dim myArray() as String

然后修改它

Redim Preserve (newDimension1, newDimension2)

但是在 VB.NET 中,我只能编辑最右边的维度,这限制了我经常使用数组的目的。 我发现 ArrayLists 默认是动态的,所以我可以通过简单地使用 .add 或 .remove 来“扩展”它们,它完全符合我的需求,但我读到我不能添加多个维度(如果我没记错的话)。

我也对列表(不允许多个维度)和 KeyValuePairs 有所了解,它们根本不是动态的,只使用 2 个维度。

我知道这对你们中的许多人来说可能听起来太笼统了,但在这种情况下,哪些系列最适合我的需求?有没有某种多维动态列表/数组/不知道是什么?

感谢大家的回答和理解。

编辑

尽管您的所有答案都非常有趣(Olivier 的答案在处理动态变量的名称时非常有用),但似乎 vb 在其集合中显示了一个限制。

关于目的,它是通用的,因为数组(以及一般的集合)经常在 OOL 中使用,每个人都将其用于自己的范围。

我个人使用它的原因之一是“存储”数据 - 例如 Excel 范围。

大家建议不要使用这种经典方法

dim myArray as Object(,) = CType(xlRange.Value, Object(,))

它确实产生了一个 2d 数组,但作为回报,它在效率和转换为其他对象方面也有自己的问题,所以我想知道是否存在一种“更干净”的方法,可以在未知维度的情况下以更优雅的方式产生相同的结果(我并不是真的喜欢量身定制的一次性功能)。

再次感谢您抽出时间接受采访!

数组 vb.net ArrayList 动态 集合

评论

1赞 jmcilhinney 7/1/2023
不幸的是,你的问题并没有一个明确的答案,所以它真的太基于意见了。我要说的是,没有适合您需求的集合类型。如果它们很小,那么您可以使用 2D 数组,只需编写自己的方法来创建一个新数组并复制数据,这就是 ReDim Preserve 所做的。或者,使用 DataTable,它允许您根据需要添加和删除列和行。
1赞 Andrew Morton 7/1/2023
你可以有一个List(Of List(Of ...))。拥有 List(Of SomeClass) 通常很有用,并且该类可以将列表作为其(某些)属性。
0赞 Étienne Laneville 7/1/2023
使用 List(Of List(Of String)) 怎么样?

答:

1赞 Olivier Jacot-Descombes 7/1/2023 #1

您可以创建一个 .但是,您必须为外部列表的每个条目创建内部列表。与数组不同,数组在创建数组后可以访问数组中的每个位置,您必须首先向列表中添加项目以使其增长。List(Of List(Of String))

' Create the list
Dim list = new List(Of List(Of String))()

' Add an empty inner list to the outer list
list.Add(new List(Of String)())

' Add elements to this inner list
list(0).Add("hello")
list(0).Add("world")

' Add a second inner list with a collection initializer
list.Add(New List(Of String) From {"aaa", "bbb", "ccc"})

' Access an element
Dim s As String = list(1)(2) ' = "ccc"

但您也可以组合其他类型的集合。例如,您可以创建一个数组的数组,也称为锯齿状数组,它与 2D 数组不同。或者,您可以创建列表数组或数组列表。

您甚至可以创建一个以元组为键的字典。当只有少数索引头寸被占用时,这尤其有利。

Dim dict As New Dictionary(Of (Integer, Integer), String)()
dict((0, 0)) = "hello"
dict((0, 1)) = "world"
dict((1, 0)) = "aaa"
dict((1, 1)) = "bbb"
dict((1, 2)) = "ccc"

Dim s As String = dict((1, 2)) ' = "ccc"

在 .NET 中,对如何组合类型几乎没有限制。

评论

0赞 jmcilhinney 7/2/2023
我想说的是列表列表的主要问题是没有适当的列。内部列表不限制为具有相同数量的项目,“添加列”需要向每个内部列表添加一个项目。这些不是表演障碍,但它们远非理想。
0赞 Olivier Jacot-Descombes 7/2/2023
@jmcilhinney,是的。我们不知道用例,因此很难给出“最佳答案”。