VB.NET创建数据数组实现年月匹配查询及类内循环问题求助
VB.NET 数字表格填充与查找实现方案
一、解决类中无法直接写循环的问题
你的代码报错是因为类的成员声明区域只能定义变量、属性或方法,不能直接写执行语句(比如For循环)。必须把填充数组的逻辑放到构造函数(类实例化时自动执行)或者其他方法里。
修改后的代码示例:
Public Class BarCodeNum Public Table(12, 9) As Decimal ' 构造函数:实例化类时自动填充数组 Public Sub New() For i = 0 To 12 For x = 0 To 9 Table(i, x) = GetCellValue(i, x) Next Next End Sub ' 提取单元格值的逻辑,让代码更简洁易维护 Private Function GetCellValue(row As Integer, col As Integer) As Decimal Return row Select Case Case 0 : 202 & col Case 1 : col & 37 Case 2 : col & 38 Case 3 : col & 39 Case 4 : col & 40 Case 5 : col & 73 Case 6 : col & 74 Case 7 : col & 75 Case 8 : col & 76 Case 9 : col & 77 Case 10 : col & 78 Case 11 : col & 79 Case 12 : col & 80 End Select End Function End Class
使用时只需实例化类,数组就会自动填充:
Dim barCodeHelper As New BarCodeNum() ' 访问第2行第3列的值:barCodeHelper.Table(2,3)
二、手动声明VS循环填充的选择
- 循环填充(推荐):你的数据有明显规律,循环代码量少,后续修改某行规则时只需调整对应
Case,维护成本低。 - 手动声明:仅适合数据完全无规律的场景,代码会非常冗长,比如:
Public Table(12,9) As Decimal = { {2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029}, {37, 137, 237, 337, 437, 537, 637, 737, 837, 937}, ' 其余行依次手动赋值... }
显然你的场景用循环更合适。
三、用DataTable实现更灵活的表格操作
如果需要筛选、排序或和数据库交互,DataTable比二维数组更灵活:
1. 创建并填充DataTable
Public Class BarCodeNum Public BarCodeTable As DataTable Public Sub New() ' 定义表格列:月份索引、数字索引、对应值 BarCodeTable = New DataTable() BarCodeTable.Columns.Add("MonthIndex", GetType(Integer)) BarCodeTable.Columns.Add("NumIndex", GetType(Integer)) BarCodeTable.Columns.Add("Value", GetType(Decimal)) ' 填充数据 For i = 0 To 12 For x = 0 To 9 Dim cellValue As Decimal = i Select Case Case 0 : 202 & x Case 1 : x & 37 Case 2 : x & 38 Case 3 : x & 39 Case 4 : x & 40 Case 5 : x & 73 Case 6 : x & 74 Case 7 : x & 75 Case 8 : x & 76 Case 9 : x & 77 Case 10 : x & 78 Case 11 : x & 79 Case 12 : x & 80 End Select BarCodeTable.Rows.Add(i, x, cellValue) Next Next End Sub End Class
2. 根据索引查找值
用Linq查找(需导入System.Linq):
Dim barCodeHelper As New BarCodeNum() Dim targetRow = barCodeHelper.BarCodeTable.AsEnumerable().FirstOrDefault( Function(row) row.Field(Of Integer)("MonthIndex") = 1 And row.Field(Of Integer)("NumIndex") = 5 ) If targetRow IsNot Nothing Then Dim targetValue As Decimal = targetRow.Field(Of Decimal)("Value") ' 处理找到的值 End If
或用DataTable原生Select方法:
Dim rows() As DataRow = barCodeHelper.BarCodeTable.Select("MonthIndex = 1 AND NumIndex = 5") If rows.Length > 0 Then Dim targetValue As Decimal = CDec(rows(0)("Value")) End If
四、根据数值反向查找年月索引
如果需要根据给定数字找到对应的年月索引(i和x),可以添加以下方法:
数组版本
Public Function FindIndexesByValue(target As Decimal) As (monthIndex As Integer?, numIndex As Integer?) For i = 0 To 12 For x = 0 To 9 If Table(i, x) = target Then Return (i, x) End If Next Next ' 未找到返回空值 Return (Nothing, Nothing) End Function
DataTable版本
Public Function FindIndexesByValue(target As Decimal) As (monthIndex As Integer?, numIndex As Integer?) Dim targetRow = BarCodeTable.AsEnumerable().FirstOrDefault(Function(r) r.Field(Of Decimal)("Value") = target) If targetRow IsNot Nothing Then Return (targetRow.Field(Of Integer)("MonthIndex"), targetRow.Field(Of Integer)("NumIndex")) Else Return (Nothing, Nothing) End If End Function
内容的提问来源于stack exchange,提问作者Will_Nguyen
相关产品推荐
相关产品推荐

