如何实现按多动态参数排序List(Of BomList)的通用函数?
通用BomList排序实现方案
问题分析
你当前的if-else分支方式扩展性差,新增排序规则必须修改函数内部逻辑,违反开闭原则。以下两种方案可以实现灵活、可扩展的通用排序,无需修改核心代码即可新增规则。
方案一:字典映射排序策略(简洁高效)
通过字典将排序标识与对应的排序逻辑绑定,新增规则只需添加字典条目,无需修改判断逻辑。支持传递额外参数(如自定义ReqType顺序)。
实现代码
Imports System Imports System.Collections.Generic Imports System.Linq Public Module Module1 Dim BomList As New List(Of BomList) ' 预定义排序策略字典:键为排序标识,值为带参数的排序逻辑 Private _sortStrategies As New Dictionary(Of String, Func(Of List(Of BomList), Object(), List(Of BomList))) From { ' 按PartNumber排序 {"PN", Function(list, args) Return list.OrderBy(Function(x) x.PartNumber).ToList() End Function}, ' 按Vendor → PartNumber排序 {"Vendor-PN", Function(list, args) Return list.OrderBy(Function(x) x.Vendor).ThenBy(Function(x) x.PartNumber).ToList() End Function}, ' 按自定义ReqType顺序 → Vendor → PartNumber排序(需传入ReqType顺序列表) {"ReqType-Vendor-PN", Function(list, args) Dim reqTypeOrder = DirectCast(args(0), List(Of String)) Return list.OrderBy(Function(x) ' 处理未知ReqType:放到所有指定类型之后 Dim idx = reqTypeOrder.IndexOf(x.ReqType) Return If(idx = -1, reqTypeOrder.Count, idx) End Function).ThenBy(Function(x) x.Vendor).ThenBy(Function(x) x.PartNumber).ToList() End Function} } Public Sub Main() ' 初始化测试数据 BomList.Add(New BomList("", "5678", "Desc", "Rev", "Designer", "B", "BBB")) BomList.Add(New BomList("", "dfgh", "Desc", "Rev", "Designer", "R", "lll")) BomList.Add(New BomList("", "3457", "Desc", "Rev", "Designer", "M", "MMM")) BomList.Add(New BomList("", "1234", "Desc", "Rev", "Designer", "B", "NNN")) BomList.Add(New BomList("", "asdf", "Desc", "Rev", "Designer", "R", "ccc")) BomList.Add(New BomList("", "7896", "Desc", "Rev", "Designer", "M", "MMM")) BomList.Add(New BomList("", "3698", "Desc", "Rev", "Designer", "B", "EEE")) ' 调用示例:按自定义ReqType顺序排序 Dim reqTypeOrder = New List(Of String)({"M", "B", "R"}) Dim sortedList = SortBomList("ReqType-Vendor-PN", reqTypeOrder) For Each item In sortedList Console.WriteLine($"{item.PartNumber} : {item.ReqType} : {item.Vendor}") Next End Sub ' 通用排序入口函数 Public Function SortBomList(sortKey As String, ParamArray args() As Object) As List(Of BomList) If _sortStrategies.ContainsKey(sortKey) Then Return _sortStrategies(sortKey)(BomList, args) Else ' 默认排序:按PartNumber Return BomList.OrderBy(Function(x) x.PartNumber).ToList() End If End Function End Module Public Class BomList Public FilePath As String = "" Public PartNumber As String Public Description As String Public Revision As String Public Designer As String Public ReqType As String Public Vendor As String Public Sub New(FilePath As String, PartNumber As String, Description As String, Revision As String, Designer As String, ReqType As String, Vendor As String) Me.FilePath = FilePath Me.PartNumber = PartNumber Me.Description = Description Me.Revision = Revision Me.Designer = Designer Me.ReqType = ReqType Me.Vendor = Vendor End Sub End Class
新增排序规则
只需在_sortStrategies字典中添加新的键值对即可,例如新增按Designer排序:
{"Designer", Function(list, args) list.OrderBy(Function(x) x.Designer).ToList()}
方案二:策略模式(高扩展性)
将每个排序规则封装为独立的策略类,实现统一接口,适合复杂排序场景,完全符合开闭原则,新增规则只需新增类,无需修改现有代码。
实现代码
Imports System Imports System.Collections.Generic Imports System.Linq Public Module Module1 Dim BomList As New List(Of BomList) Public Sub Main() ' 初始化测试数据 BomList.Add(New BomList("", "5678", "Desc", "Rev", "Designer", "B", "BBB")) BomList.Add(New BomList("", "dfgh", "Desc", "Rev", "Designer", "R", "lll")) BomList.Add(New BomList("", "3457", "Desc", "Rev", "Designer", "M", "MMM")) BomList.Add(New BomList("", "1234", "Desc", "Rev", "Designer", "B", "NNN")) BomList.Add(New BomList("", "asdf", "Desc", "Rev", "Designer", "R", "ccc")) BomList.Add(New BomList("", "7896", "Desc", "Rev", "Designer", "M", "MMM")) BomList.Add(New BomList("", "3698", "Desc", "Rev", "Designer", "B", "EEE")) ' 调用示例:使用自定义ReqType顺序策略 Dim reqTypeOrder = New List(Of String)({"M", "B", "R"}) Dim sortedList = SortBomList(New ReqTypeCustomSortStrategy(reqTypeOrder)) For Each item In sortedList Console.WriteLine($"{item.PartNumber} : {item.ReqType} : {item.Vendor}") Next End Sub ' 通用排序入口:接受策略实例 Public Function SortBomList(strategy As IBomSortStrategy) As List(Of BomList) Return strategy.Sort(BomList) End Function End Module ' 排序策略接口 Public Interface IBomSortStrategy Function Sort(list As List(Of BomList)) As List(Of BomList) End Interface ' 按PartNumber排序的策略类 Public Class PartNumberSortStrategy Implements IBomSortStrategy Public Function Sort(list As List(Of BomList)) As List(Of BomList) Implements IBomSortStrategy.Sort Return list.OrderBy(Function(x) x.PartNumber).ToList() End Function End Class ' 按Vendor→PartNumber排序的策略类 Public Class VendorPartNumberSortStrategy Implements IBomSortStrategy Public Function Sort(list As List(Of BomList)) As List(Of BomList) Implements IBomSortStrategy.Sort Return list.OrderBy(Function(x) x.Vendor).ThenBy(Function(x) x.PartNumber).ToList() End Function End Class ' 自定义ReqType顺序的排序策略类 Public Class ReqTypeCustomSortStrategy Implements IBomSortStrategy Private ReadOnly _reqTypeOrder As List(Of String) Public Sub New(reqTypeOrder As List(Of String)) _reqTypeOrder = reqTypeOrder End Sub Public Function Sort(list As List(Of BomList)) As List(Of BomList) Implements IBomSortStrategy.Sort Return list.OrderBy(Function(x) Dim idx = _reqTypeOrder.IndexOf(x.ReqType) Return If(idx = -1, _reqTypeOrder.Count, idx) End Function).ThenBy(Function(x) x.Vendor).ThenBy(Function(x) x.PartNumber).ToList() End Function End Class Public Class BomList Public FilePath As String = "" Public PartNumber As String Public Description As String Public Revision As String Public Designer As String Public ReqType As String Public Vendor As String Public Sub New(FilePath As String, PartNumber As String, Description As String, Revision As String, Designer As String, ReqType As String, Vendor As String) Me.FilePath = FilePath Me.PartNumber = PartNumber Me.Description = Description Me.Revision = Revision Me.Designer = Designer Me.ReqType = ReqType Me.Vendor = Vendor End Sub End Class
新增排序规则
只需新增一个实现IBomSortStrategy接口的类即可,例如新增按Revision排序:
Public Class RevisionSortStrategy Implements IBomSortStrategy Public Function Sort(list As List(Of BomList)) As List(Of BomList) Implements IBomSortStrategy.Sort Return list.OrderBy(Function(x) x.Revision).ToList() End Function End Class
方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 字典映射 | 代码简洁,实现快,无需新增类 | 复杂逻辑的可读性稍差 | 中小规模排序规则,快速实现 |
| 策略模式 | 逻辑清晰,扩展性强,符合开闭原则 | 代码量稍大,需要维护多个类 | 复杂排序规则,长期迭代的项目 |
内容的提问来源于stack exchange,提问作者pball
相关产品推荐
相关产品推荐

