Forum Discussion
RobbSalzmann
3 years agoValued Contributor II
The sorting posted so far relies on standard lexical ordering which produces an order that can be a bit strange for a business user:
This code will help sort things in a human, alphanumeric order:
Public Class MainClass
Public Function Main(si As SessionInfo, globals As BRGlobals, api As Object, args As ExtenderArgs) As Object
Try
Dim mbrLst As New MemberList()
Dim mbrDisplayOptions As MemberDisplayOptions = New MemberDisplayOptions() _
With{ .IncludeAllProperties = True, .IncludeMemberInfoForProperties = True}
Dim lstMembers As LIst(Of MemberInfo) =
BRApi.Finance.Metadata.GetMembersUsingFilter(si, "CorpAccounts", "A#[GAAP Account Structure].Base", True, Nothing, mbrDisplayOptions)
lstMembers.Sort(New AlphaNumericMemberInfoComparer())
mbrLst.AddMemberInfosToList(lstMembers)
Return mbrLst
Catch ex As Exception
Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
End Try
End Function
End Class
Public Class AlphaNumericMemberInfoComparer
Implements IComparer(Of MemberInfo)
Public Function Compare(x As MemberInfo, y As MemberInfo) As Integer Implements IComparer(Of MemberInfo).Compare
If x.Member.Name = y.Member.Name Then Return 0
Dim xParts() As String = Regex.Split(x.Member.Name, "(\d+)")
Dim yParts() As String = Regex.Split(y.Member.Name, "(\d+)")
For i As Integer = 0 To Math.Min(xParts.Length, yParts.Length) - 1
If xParts(i) <> yParts(i) Then
Return PartCompare(xParts(i), yParts(i))
End If
Next
Return xParts.Length.CompareTo(yParts.Length)
End Function
Private Shared Function PartCompare(x As String, y As String) As Integer
Dim a, b As Integer
Dim isNumericX As Boolean = Integer.TryParse(x, a)
Dim isNumericY As Boolean = Integer.TryParse(y, b)
If isNumericX And isNumericY Then
Return a.CompareTo(b)
End If
Return String.Compare(x, y, StringComparison.OrdinalIgnoreCase)
End Function
End ClassAlternate Sorting Result:
Related Content
- 7 months ago