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

如何实现按多动态参数排序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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:03:10