下图为例: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