VBScript 循环建议
VBScript loop advice
sqlRows = rst.GetRows()
i = 0
For Each element In sqlRows
If i > 0 And i < sizeOfState + 1 Then
SmartTags("visu_state_on")(i - 1) = element
ElseIf i > sizeOfState And i < 2 * sizeOfState + 1 Then
SmartTags("visu_state_off")(i - sizeOfState - 1) = element
ElseIf i > (2 * sizeOfState ) And i < 2 * sizeOfState + sizeOfMeasurement + 1 Then
SmartTags("visu_limits_right")(i - (2 * sizeOfState - 1)) = element
ElseIf i > 2 * sizeOfState + sizeOfMeasurement And i < 2 * (sizeOfStanja + sizeOfMeasurement ) + 1 Then
SmartTags("visu_limits_left")(i - (2 * sizeOfState + sizeOfMeasurement )) = element
End If
i = i + 1
Next
使用上面的代码,我在数组 sqlRows
中循环,并使用变量 i
用来自 sqlRows
的数据填充其他四个数组。
这个解决方案有效,但我想知道是否有更优雅的方法来实现同样的效果。
- sqlRows 是维度为 343x1 的数组,
- visu_state_on 是尺寸为 8x1 的数组,
- visu_state_off 是维度为 8x1 的数组,
- visu_limits_right 是尺寸为 160x1 的数组,
- visu_limits_left 是尺寸为 160x1 的数组,
和变量 sizeOfState
和 sizeOfMeasurement
就在那里,我可以计算这四个数组的索引。
一方面,您可以从每个条件中删除第一个子句,因为它们始终为真
i
从值 0 开始并始终递增,因此该值永远不会小于零。
- 如果一个值不小于
n + 1
(前面ElseIf
的条件)那么它保证大于n
.
此外,VBScript 确实有一个 <=
比较运算符,因此最好比较 i <= n
而不是 i < n + 1
。
我还建议计算在循环外不会在循环内改变一次的值。在每个循环周期重新计算它们是一种资源浪费。
添加一个 Else
分支来处理大于 2 * (sizeOfStanja + sizeOfMeasurement)
的值可能也是一个好主意。
sqlRows = rst.GetRows()
i = 0
ref1 = 2 * sizeOfState
ref2 = ref1 + sizeOfMeasurement
ref3 = 2 * (sizeOfStanja + sizeOfMeasurement)
For Each element In sqlRows
If i <= sizeOfState Then
SmartTags("visu_state_on")(i - 1) = element
ElseIf i <= ref1 Then
SmartTags("visu_state_off")(i - sizeOfState - 1) = element
ElseIf i <= ref2 Then
SmartTags("visu_limits_right")(i - ref1 + 1) = element
ElseIf i <= ref3 Then
SmartTags("visu_limits_left")(i - ref2) = element
Else
'handle i > ref3 here
End If
i = i + 1
Next
sqlRows = rst.GetRows()
i = 0
For Each element In sqlRows
If i > 0 And i < sizeOfState + 1 Then
SmartTags("visu_state_on")(i - 1) = element
ElseIf i > sizeOfState And i < 2 * sizeOfState + 1 Then
SmartTags("visu_state_off")(i - sizeOfState - 1) = element
ElseIf i > (2 * sizeOfState ) And i < 2 * sizeOfState + sizeOfMeasurement + 1 Then
SmartTags("visu_limits_right")(i - (2 * sizeOfState - 1)) = element
ElseIf i > 2 * sizeOfState + sizeOfMeasurement And i < 2 * (sizeOfStanja + sizeOfMeasurement ) + 1 Then
SmartTags("visu_limits_left")(i - (2 * sizeOfState + sizeOfMeasurement )) = element
End If
i = i + 1
Next
使用上面的代码,我在数组 sqlRows
中循环,并使用变量 i
用来自 sqlRows
的数据填充其他四个数组。
这个解决方案有效,但我想知道是否有更优雅的方法来实现同样的效果。
- sqlRows 是维度为 343x1 的数组,
- visu_state_on 是尺寸为 8x1 的数组,
- visu_state_off 是维度为 8x1 的数组,
- visu_limits_right 是尺寸为 160x1 的数组,
- visu_limits_left 是尺寸为 160x1 的数组,
和变量 sizeOfState
和 sizeOfMeasurement
就在那里,我可以计算这四个数组的索引。
一方面,您可以从每个条件中删除第一个子句,因为它们始终为真
i
从值 0 开始并始终递增,因此该值永远不会小于零。- 如果一个值不小于
n + 1
(前面ElseIf
的条件)那么它保证大于n
.
此外,VBScript 确实有一个 <=
比较运算符,因此最好比较 i <= n
而不是 i < n + 1
。
我还建议计算在循环外不会在循环内改变一次的值。在每个循环周期重新计算它们是一种资源浪费。
添加一个 Else
分支来处理大于 2 * (sizeOfStanja + sizeOfMeasurement)
的值可能也是一个好主意。
sqlRows = rst.GetRows()
i = 0
ref1 = 2 * sizeOfState
ref2 = ref1 + sizeOfMeasurement
ref3 = 2 * (sizeOfStanja + sizeOfMeasurement)
For Each element In sqlRows
If i <= sizeOfState Then
SmartTags("visu_state_on")(i - 1) = element
ElseIf i <= ref1 Then
SmartTags("visu_state_off")(i - sizeOfState - 1) = element
ElseIf i <= ref2 Then
SmartTags("visu_limits_right")(i - ref1 + 1) = element
ElseIf i <= ref3 Then
SmartTags("visu_limits_left")(i - ref2) = element
Else
'handle i > ref3 here
End If
i = i + 1
Next