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

VB.NET代码简化与复用咨询:优化字母替换查询逻辑

解决方案:封装类实现代码复用与简化

完全适合用类来处理这类场景,通过封装替换规则、候选字符串生成逻辑和数据库查询逻辑,能大幅提升代码的复用性、可维护性和可读性。以下是具体实现步骤和重构后的代码:


1. 定义替换规则实体

首先创建一个类来统一描述替换规则,支持全局替换和指定位置替换两种场景:

Public Class SostituzioneRegola
    ' 待替换的原字符
    Public Property CarattereVecchio As Char
    ' 替换后的新字符
    Public Property CarattereNuovo As Char
    ' 指定替换位置(可选,为Null时表示全局替换所有匹配字符)
    Public Property Posizione As Integer? = Nothing

    ' 执行替换操作的方法
    Public Function Applica(input As String) As String
        If Posizione.HasValue AndAlso Posizione >= 0 AndAlso Posizione < input.Length Then
            ' 处理指定位置替换:仅当目标位置字符匹配时才替换
            Dim chars = input.ToCharArray()
            If chars(Posizione.Value) = CarattereVecchio Then
                chars(Posizione.Value) = CarattereNuovo
            End If
            Return New String(chars)
        Else
            ' 处理全局替换:替换所有匹配字符
            Return input.Replace(CarattereVecchio, CarattereNuovo)
        End If
    End Function
End Class

2. 封装核心处理类

创建一个服务类,把替换规则初始化、候选字符串生成、数据库查询逻辑全部封装进去:

Public Class TargaCorrezioneService
    Private ReadOnly _dbContext As YourDbContextType ' 替换为你的实际DbContext类型
    Private ReadOnly _regoleSostituzione As List(Of SostituzioneRegola)

    ' 构造函数:注入DbContext并初始化替换规则
    Public Sub New(dbContext As YourDbContextType)
        _dbContext = dbContext
        ' 初始化所有替换规则(与原代码逻辑完全一致)
        _regoleSostituzione = New List(Of SostituzioneRegola) From {
            ' 全局替换规则
            New SostituzioneRegola With {.CarattereVecchio = "C"c, .CarattereNuovo = "G"c},
            New SostituzioneRegola With {.CarattereVecchio = "G"c, .CarattereNuovo = "C"c},
            New SostituzioneRegola With {.CarattereVecchio = "C"c, .CarattereNuovo = "D"c},
            New SostituzioneRegola With {.CarattereVecchio = "V"c, .CarattereNuovo = "W"c},
            New SostituzioneRegola With {.CarattereVecchio = "F"c, .CarattereNuovo = "H"c},
            New SostituzioneRegola With {.CarattereVecchio = "K"c, .CarattereNuovo = "X"c},
            New SostituzioneRegola With {.CarattereVecchio = "D"c, .CarattereNuovo = "O"c},
            New SostituzioneRegola With {.CarattereVecchio = "A"c, .CarattereNuovo = "E"c},
            ' 指定位置替换规则
            New SostituzioneRegola With {.CarattereVecchio = "C"c, .CarattereNuovo = "G"c, .Posizione = 0},
            New SostituzioneRegola With {.CarattereVecchio = "C"c, .CarattereNuovo = "G"c, .Posizione = 1},
            New SostituzioneRegola With {.CarattereVecchio = "G"c, .CarattereNuovo = "C"c, .Posizione = 0},
            New SostituzioneRegola With {.CarattereVecchio = "G"c, .CarattereNuovo = "C"c, .Posizione = 1},
            New SostituzioneRegola With {.CarattereVecchio = "C"c, .CarattereNuovo = "G"c, .Posizione = 5},
            New SostituzioneRegola With {.CarattereVecchio = "C"c, .CarattereNuovo = "G"c, .Posizione = 6},
            New SostituzioneRegola With {.CarattereVecchio = "G"c, .CarattereNuovo = "C"c, .Posizione = 5},
            New SostituzioneRegola With {.CarattereVecchio = "G"c, .CarattereNuovo = "C"c, .Posizione = 6}
        }
    End Sub

    ' 生成所有候选字符串(包含原字符串)
    Public Function GeneraCandidati(targaInput As String) As List(Of String)
        Dim candidati = New List(Of String) From {targaInput} ' 优先检查原字符串
        ' 应用所有替换规则生成候选
        candidati.AddRange(_regoleSostituzione.Select(Function(r) r.Applica(targaInput)))
        Return candidati.Distinct().ToList() ' 去重避免重复查询
    End Function

    ' 查询并返回正确的记录及对应车牌
    Public Function TrovaTargaCorretta(targaInput As String) As Tuple(Of String, ANAGRAFICO)
        Dim candidati = GeneraCandidati(targaInput)
        ' 遍历候选,找到第一个存在的记录(仅一次数据库查询/候选)
        For Each candidato In candidati
            Dim anagrafica = _dbContext.ANAGRAFICO.FirstOrDefault(Function(a) a.CODFISC = candidato)
            If anagrafica IsNot Nothing Then
                Return Tuple.Create(candidato, anagrafica)
            End If
        Next
        ' 未找到匹配记录的情况
        Return Tuple.Create(String.Empty, Nothing)
    End Function
End Class

3. 重构原业务代码

现在可以用简洁的代码完成原逻辑,且该服务类可在任何函数中复用:

' 初始化服务(建议在类级别实例化,复用DbContext)
Dim correzioneService As New TargaCorrezioneService(dbStart)

' 保留原LINQ查询逻辑
arr_TargheRifiutate = dbCaw.transiti.Where(
    Function(t) (t.dataora >= dataInizio And t.dataora < dataFine) And
    (Not t.autorizzato.HasValue Or t.autorizzato = 0) And
    t.identificativo.Length = 7 And Not t.identificativo.Contains("2365")).ToList

' 遍历处理每个车牌
For Each targa In arr_TargheRifiutate
    Dim risultato = correzioneService.TrovaTargaCorretta(targa.identificativo)
    Dim targaCorretta As String = risultato.Item1
    Dim anagrafica As ANAGRAFICO = risultato.Item2

    ' 继续你的业务逻辑(比如标记正确值等)
Next

优势说明

  1. 复用性:TargaCorrezioneService可在任意需要车牌校正的函数中直接实例化调用,无需重复编写替换和查询逻辑
  2. 可维护性:新增/修改替换规则只需在_regoleSostituzione列表中调整,无需改动业务代码
  3. 性能优化:原代码中Any()+SingleOrDefault()会触发两次数据库查询,现在用FirstOrDefault()仅需一次查询,减少数据库交互
  4. 可读性:主业务代码更简洁,核心逻辑被封装到类中,职责清晰

内容的提问来源于stack exchange,提问作者Gabriele Cozzolino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:25:02