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
优势说明
- 复用性:
TargaCorrezioneService可在任意需要车牌校正的函数中直接实例化调用,无需重复编写替换和查询逻辑 - 可维护性:新增/修改替换规则只需在
_regoleSostituzione列表中调整,无需改动业务代码 - 性能优化:原代码中
Any()+SingleOrDefault()会触发两次数据库查询,现在用FirstOrDefault()仅需一次查询,减少数据库交互 - 可读性:主业务代码更简洁,核心逻辑被封装到类中,职责清晰
内容的提问来源于stack exchange,提问作者Gabriele Cozzolino
相关产品推荐
相关产品推荐

