Redim 保留数组
Redim Preserve array
我正在向 listOF 添加元素,然后将该列表转换为数组。然后,我需要向每个数组添加特定数量的元素,同时还要保留每个元素中的数据。我很接近但还没有。
这是行不通的。该数据保留在元素中,但代码没有将指定数量的元素添加到每个数组(每个数组需要 = 51)。
一如既往地感谢您的帮助。谢谢。
'Add an element to each ListOf(Integer) based on how many rows are in the DataGridView
For Each r As DataGridViewRow In dgvStepTest.Rows
accels.Add(r.Cells(0).Value) : decels.Add(r.Cells(1).Value) : Speeds.Add(r.Cells(2).Value)
holds.Add(r.Cells(3).Value) : flows.Add(r.Cells(4).Value) : Temps.Add(r.Cells(5).Value)
Next
'Convert each ListOf(Integer) to an Array
accels.TrimExcess() : accelRates = accels.ToArray
decels.TrimExcess() : decelRates = decels.ToArray
Speeds.TrimExcess() : spindleSpeeds = Speeds.ToArray
holds.TrimExcess() : holdTimes = holds.ToArray
flows.TrimExcess() : flowRates = flows.ToArray
Temps.TrimExcess() : oilTemps = Temps.ToArray
'Now determine the number of elements to add to each of the arrays so that the length of each array = 51
num = (51 - accelRates.Length)
'Now add the number of elements to each array based on the number calculated above, while also preserving the data
'already in each element in each of the arrays. New elements added should have values = 0.
Dim jaggedArray()() = New Integer(5)() {accelRates, decelRates, spindleSpeeds, holdTimes, flowRates, oilTemps}
For Each [Array] In jaggedArray
ReDim Preserve Array(Array.Length + num)
Next
我认为您看到的是设置数组中项目总数的 redim 语句,因此您需要做的就是将数组重新调整为您想要的大小,无需进行数学计算,记住数组是基于 0 的,这意味着使用 redim 语句将数组大小设置为 51 实际上将有 52 条记录。这是一个快速的小测试来说明我的意思。
Module Module1
Sub Main()
Dim accels As List(Of Integer) = New List(Of Integer)()
accels.AddRange({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
Dim accelrates = accels.ToArray()
Dim num As Integer = (50) ' Index is zero based there for use 50
ReDim Preserve accelrates(num)
End Sub
End Module
或者您可以按照 VisualVincent 的建议使用 Array.Resize
Array.Resize(accelrates, 51)
进一步观察,您的 For Each
语句似乎没有按您预期的那样工作。我会将其更改为类似这样的 For
语句。
For x = 0 To jaggedArray.Count - 1
ReDim Preserve jaggedArray(x)(50)
Next
我正在向 listOF 添加元素,然后将该列表转换为数组。然后,我需要向每个数组添加特定数量的元素,同时还要保留每个元素中的数据。我很接近但还没有。
这是行不通的。该数据保留在元素中,但代码没有将指定数量的元素添加到每个数组(每个数组需要 = 51)。
一如既往地感谢您的帮助。谢谢。
'Add an element to each ListOf(Integer) based on how many rows are in the DataGridView
For Each r As DataGridViewRow In dgvStepTest.Rows
accels.Add(r.Cells(0).Value) : decels.Add(r.Cells(1).Value) : Speeds.Add(r.Cells(2).Value)
holds.Add(r.Cells(3).Value) : flows.Add(r.Cells(4).Value) : Temps.Add(r.Cells(5).Value)
Next
'Convert each ListOf(Integer) to an Array
accels.TrimExcess() : accelRates = accels.ToArray
decels.TrimExcess() : decelRates = decels.ToArray
Speeds.TrimExcess() : spindleSpeeds = Speeds.ToArray
holds.TrimExcess() : holdTimes = holds.ToArray
flows.TrimExcess() : flowRates = flows.ToArray
Temps.TrimExcess() : oilTemps = Temps.ToArray
'Now determine the number of elements to add to each of the arrays so that the length of each array = 51
num = (51 - accelRates.Length)
'Now add the number of elements to each array based on the number calculated above, while also preserving the data
'already in each element in each of the arrays. New elements added should have values = 0.
Dim jaggedArray()() = New Integer(5)() {accelRates, decelRates, spindleSpeeds, holdTimes, flowRates, oilTemps}
For Each [Array] In jaggedArray
ReDim Preserve Array(Array.Length + num)
Next
我认为您看到的是设置数组中项目总数的 redim 语句,因此您需要做的就是将数组重新调整为您想要的大小,无需进行数学计算,记住数组是基于 0 的,这意味着使用 redim 语句将数组大小设置为 51 实际上将有 52 条记录。这是一个快速的小测试来说明我的意思。
Module Module1
Sub Main()
Dim accels As List(Of Integer) = New List(Of Integer)()
accels.AddRange({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
Dim accelrates = accels.ToArray()
Dim num As Integer = (50) ' Index is zero based there for use 50
ReDim Preserve accelrates(num)
End Sub
End Module
或者您可以按照 VisualVincent 的建议使用 Array.Resize
Array.Resize(accelrates, 51)
进一步观察,您的 For Each
语句似乎没有按您预期的那样工作。我会将其更改为类似这样的 For
语句。
For x = 0 To jaggedArray.Count - 1
ReDim Preserve jaggedArray(x)(50)
Next