VB.NET中如何一次性修改结构数组成员的数组大小?
问题描述
我定义了如下结构:
Public Structure Plant Public Position() As Double Dim Cost As Double Dim Seed As Double End Structure
并创建了结构数组:
Dim Population(10) As Plant
我需要为Population中所有元素的Position数组设置相同大小(如9),不想使用循环逐个ReDim,尝试为结构添加私有构造函数后初始化数组时出现错误:
Explicit initialization is not permitted for arrays declared with explicit bounds
请问是否有更简便的一次性设置方法?
解决方案
方法1:构造函数+LINQ批量生成
先给Plant结构添加公共构造函数,在构造逻辑里直接初始化Position数组的大小:
Public Structure Plant Public Position() As Double Dim Cost As Double Dim Seed As Double Public Sub New(positionSize As Integer) ReDim Me.Position(positionSize - 1) ' 可按需设置Cost、Seed的默认值 Me.Cost = 0.0 Me.Seed = 0.0 End Sub End Structure
然后通过Enumerable.Repeat配合ToArray,一次性生成所有已初始化的结构实例数组:
' 生成11个(索引0-10)Position大小为9的Plant实例数组 Dim Population = Enumerable.Repeat(New Plant(9), 11).ToArray()
这种方式完全不需要手动循环,一步完成所有元素的Position初始化。
方法2:数组初始化器(适合小数量场景)
如果数组元素数量不多,也可以直接在数组声明时逐个初始化:
Dim Population() As Plant = { New Plant(9), New Plant(9), ' 依次补充剩余实例,直到总数为11个 }
但元素数量较多时,这种方法效率不如第一种。
关键说明
你之前遇到的错误,原因是声明固定边界的数组(Dim Population(10))后,无法再使用显式初始化器。解决的核心是改用无边界数组声明,或者通过LINQ动态生成数组。另外,VB的结构是值类型,Enumerable.Repeat生成的每个数组元素都是独立的实例,修改其中一个的属性不会影响其他元素。
内容的提问来源于stack exchange,提问作者John Jin
相关产品推荐
相关产品推荐

