You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 11:21:02