将Excel内不规则的内容,根据一定要求拼出级别-VB.Net

下图为例:A列为级别,B列为需要拼起来的内容,C列为拼后的内容。

 一 and 二需要的自定义类

Public Class colModel
    Public strA As String = ""
    Public strB As String = ""
End Class

一、在方法内使用(匿名委托)

 '拼级别(此处例子为 无规则的级别有两个,有规律的级别从2级开始<以.判断>)
Public Shared Sub aaa()
    '无规则
    Dim noRuleGrade As New List(Of List(Of String)) From {
        New List(Of String) From {"A", "B", "C", "D", "E", "F", "G"}, '0级
        New List(Of String) From {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十"}'1级
    }
    '2级~更多  根据.判断 没有为2级  一个为3级 依次类推
    Dim isBool As Boolean = True '是否存在有规则的级别
    Dim gradeJudge As String = "."
    Dim gradeId As Integer = 0 '当前级别(从零开始,因为list的index从0开始)
    Dim lstName As New List(Of String)
    '前提序号不能跳级(此处已于上一步同步-忽略此要求即可)
    Dim gradeFunc As Action(Of String, String) = Sub(ByVal xh As String, ByVal name As String)
                                                     '无规则级别
                                                     For i = 0 To noRuleGrade.Count - 1
                                                         Dim lstN As List(Of String) = noRuleGrade(i)
                                                         If lstN.Contains(xh) Then 'i级
                                                             gradeId = i
                                                             If gradeId = 0 Then
                                                                 lstName.Clear()
                                                             ElseIf lstName.Count > gradeId Then
                                                                 '只保留 (当前级的上一级)
                                                                 lstName = lstName.Take(1).ToList()
                                                             End If
                                                             lstName.Add(name)
                                                             GoTo leaveSub
                                                         End If
                                                     Next
                                                     If isBool Then
                                                         '2 至多级
                                                         If xh.Contains(gradeJudge) Then
                                                             Dim dotC As Integer = xh.Count(Function(c) c = ".")
                                                             gradeId = 2 + dotC
                                                         Else
                                                             gradeId = 2
                                                         End If
                                                         If lstName.Count > gradeId Then
                                                             '只保留到当前级的上一级
                                                             lstName = lstName.Take(gradeId).ToList()
                                                         End If
                                                         lstName.Add(name)
                                                     End If
leaveSub:
                                                 End Sub

    Dim lst As New List(Of colModel) From {New colModel With {.strA = "…", .strB = "…"}} '等等
    Dim goal As New List(Of String)
    For Each item As colModel In lst
        Dim xh As String = item.strA
        Dim name As String = item.strB
        gradeFunc(xh, name)
        goal.Add(String.Join("-", lstName))
    Next
End Sub

二、自定义方法

方法

''' <summary>
''' 前提序号不能跳级
''' </summary>
''' <param name="xh">序号</param>
''' <param name="name">需要拼的内容</param>
''' <param name="noRuleGrade">无规则的级别 -没有请去掉循环的代码即可</param>
''' <param name="isBool">是否存在有规则的级别</param>
''' <param name="gradeJudge">有规则的级别 区分符号</param>
''' <param name="lstName">当前 内容的层级list</param>
Private Shared Sub gradeFunc(ByVal xh As String, ByVal name As String, ByVal noRuleGrade As List(Of List(Of String)), ByVal isBool As Boolean, ByVal gradeJudge As String, ByRef lstName As List(Of String))
    Dim gradeId As Integer = 0 '当前级别(从零开始,因为list的index从0开始)
    '无规则级别
    For i = 0 To noRuleGrade.Count - 1
        Dim lstN As List(Of String) = noRuleGrade(i)
        If lstN.Contains(xh) Then 'i级
            gradeId = i
            If gradeId = 0 Then
                lstName.Clear()
            ElseIf lstName.Count > gradeId Then
                '只保留 (当前级的上一级)
                lstName = lstName.Take(1).ToList()
            End If
            lstName.Add(name)
            GoTo leaveSub
        End If
    Next
    If isBool Then
        '2 至多级
        If xh.Contains(gradeJudge) Then
            Dim dotC As Integer = xh.Count(Function(c) c = ".")
            gradeId = 2 + dotC
        Else
            gradeId = 2
        End If
        If lstName.Count > gradeId Then
            '只保留到当前级的上一级
            lstName = lstName.Take(gradeId).ToList()
        End If
        lstName.Add(name)
    End If
leaveSub:
End Sub

调用方法

'拼级别(此处例子为 无规则的级别有两个,有规律的级别从2级开始<以.判断>)
Public Shared Sub aaa()
    '无规则
    Dim noRuleGrade As New List(Of List(Of String)) From {
New List(Of String) From {"A", "B", "C", "D", "E", "F", "G"}, '0级
New List(Of String) From {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十"}'1级
}
    '2级~更多  根据.判断 没有为2级  一个为3级 依次类推
    Dim isBool As Boolean = True '是否存在有规则的级别
    Dim gradeJudge As String = "." '有规则的级别 区分符号
    Dim lstName As New List(Of String)

    Dim lst As New List(Of colModel) From {New colModel With {.strA = "…", .strB = "…"}} '等等
    Dim goal As New List(Of String)
    For Each item As colModel In lst
        Dim xh As String = item.strA
        Dim name As String = item.strB
        gradeFunc(xh, name, noRuleGrade, isBool, gradeJudge, lstName)
        goal.Add(String.Join("-", lstName))
    Next
End Sub

三、在上述一、二 上添加了;判断当前级别是否末级

Public Class colModel
        Public strA As String = ""
        Public strB As String = ""
End Class

Public Class goalModel
    Public allStrB As String = "" '拼级次后all Name
    Public lastG As Boolean = False '是否是末级
End Class


''' <summary>
''' 前提序号不能跳级
''' </summary>
''' <param name="xh">序号</param>
''' <param name="name">需要拼的内容</param>
''' <param name="noRuleGrade">无规则的级别 -没有请去掉循环的代码即可</param>
''' <param name="isBool">是否存在有规则的级别</param>
''' <param name="gradeJudge">有规则的级别 区分符号</param>
''' <param name="lstName">当前 内容的层级list</param>
Private Shared Sub gradeFunc(ByVal xh As String, ByVal name As String, ByVal noRuleGrade As List(Of List(Of String)), ByVal isBool As Boolean, ByVal gradeJudge As String, ByRef lstName As List(Of String))
    Dim gradeId As Integer = 0 '当前级别(从零开始,因为list的index从0开始)
    '无规则级别
    For i = 0 To noRuleGrade.Count - 1
        Dim lstN As List(Of String) = noRuleGrade(i)
        If lstN.Contains(xh) Then 'i级
            gradeId = i
            If gradeId = 0 Then
                lstName.Clear()
            ElseIf lstName.Count > gradeId Then
                '只保留 (当前级的上一级)
                lstName = lstName.Take(1).ToList()
            End If
            lstName.Add(name)
            GoTo leaveSub
        End If
    Next
    If isBool Then
        '2 至多级
        If xh.Contains(gradeJudge) Then
            Dim dotC As Integer = xh.Count(Function(c) c = ".")
            gradeId = 2 + dotC
        Else
            gradeId = 2
        End If
        If lstName.Count > gradeId Then
            '只保留到当前级的上一级
            lstName = lstName.Take(gradeId).ToList()
        End If
        lstName.Add(name)
    End If
leaveSub:
End Sub

'拼级别(此处例子为 无规则的级别有两个,有规律的级别从2级开始<以.判断>)
Public Shared Sub aaa()
    '无规则
    Dim noRuleGrade As New List(Of List(Of String)) From {
New List(Of String) From {"A", "B", "C", "D", "E", "F", "G"}, '0级
New List(Of String) From {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十"}'1级
}
    '2级~更多  根据.判断 没有为2级  一个为3级 依次类推
    Dim isBool As Boolean = True '是否存在有规则的级别
    Dim gradeJudge As String = "." '有规则的级别 区分符号
    Dim lstName As New List(Of String)

    Dim lst As New List(Of colModel) From {New colModel With {.strA = "…", .strB = "…"}} '等等
    Dim goal As New List(Of goalModel)
    Dim i As Integer = 0
    For Each item As colModel In lst
        Dim xh As String = item.strA
        Dim name As String = item.strB
        gradeFunc(xh, name, noRuleGrade, isBool, gradeJudge, lstName)
        Dim goalM As New goalModel
        goalM.allStrB = String.Join("-", lstName)
        '判断是否末级
        If i = lst.Count - 1 Then
            goalM.lastG = True
        Else
            For no = 0 To noRuleGrade.Count - 1
                If no = noRuleGrade.Count - 1 Then
                    If Not lst(i + 1).strA = "1" Then
                        goalM.lastG = True
                        GoTo endLab
                    End If
                Else
                    If noRuleGrade(no).Contains(item.strA) Then
                        If Not noRuleGrade(no + 1).Contains(lst(i + 1).strA) Then
                            goalM.lastG = True
                            GoTo endLab
                        End If
                    End If
                End If
            Next
            If Not lst(i + 1).strA.StartsWith(item.strA) Then
                goalM.lastG = True
            End If
        End If
endLab:
        goal.Add(goalM)
    Next
End Sub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值