The class in the example stores the version number as an encoded Long with each position being between 0 and 255, 8 bits. Probably a little overkill unless you have a whole lot of this ... ;)
A form with a button is required,
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
'Test of Class VersionNumber
Dim l As New List(Of VersionNumber)
Dim test As XElement = <t>
<t>1.11</t>
<t>1</t>
<t>1.2</t>
<t>1.2.3</t>
<t>1.2.3.4</t>
<t>1.1.3</t>
<t>1.1.2</t>
<t>1.10</t>
<t>1.2.1</t>
<t>1.2</t>
<t>1.9</t>
<t>1.2.3.4.5.6.7.8</t>
</t>
Debug.WriteLine("")
Debug.WriteLine("")
Dim foo As VersionNumber
For Each el As XElement In test.Elements
Debug.WriteLine(el.Value)
foo = New VersionNumber(el.Value)
l.Add(foo)
Next
l.Sort()
Debug.WriteLine("")
Debug.WriteLine("Sorted")
For Each vn As VersionNumber In l
Debug.WriteLine(vn.ToString)
Next
End Sub
End Class
Public Class VersionNumber
Implements IComparable(Of VersionNumber), IEquatable(Of VersionNumber)
Protected Friend _version As Long = 0L
Private _verstring As String
Public Sub New(Version As String)
Dim prts() As String = Version.Trim.Split("."c)
If prts.Length <= 0 OrElse prts.Length > 8 Then
Throw New ArgumentException("Invalid version")
Else
Dim idx As Integer = 0
Dim shft As Integer = 8 - (8 - (8 - prts.Length))
Do While shft < 8
Dim L As Long = 0L
If Long.TryParse(prts(idx), L) AndAlso L >= 0 AndAlso L < 256L Then
shft += 1
idx += 1
Me._version = Me._version Or L
If shft <> 8 Then Me._version = Me._version << 8
Else
Throw New ArgumentException("Invalid version")
End If
Loop
Me._verstring = Version.Trim
shft = (8 - (8 - (8 - prts.Length))) * 8
Me._version = Me._version << shft
End If
End Sub
Public Overrides Function ToString() As String
Return Me._verstring
End Function
#Region " and Ops"
Public Function CompareTo(other As VersionNumber) As Integer _
Implements IComparable(Of VersionNumber).CompareTo
'https://msdn.microsoft.com/en-us/library/system.icomparable.compareto(v=vs.110).aspx
'return values and their meaning:
' Less than zero This instance precedes other in the sort order.
' Zero This instance occurs in the same position in the sort order as other.
' Greater than zero This instance follows other in the sort order.
If other Is Nothing Then
Return 1 'By definition, any object compares greater than (or follows) null, and two null references compare equal to each other
ElseIf Me = other Then
Return 0
ElseIf Me < other Then
Return -1
Else
Return 1
End If
End Function
Public Overloads Function Equals(other As VersionNumber) As Boolean _
Implements IEquatable(Of VersionNumber).Equals
Select Case Me.CompareTo(other)
Case 0
Return True
Case Else
Return False
End Select
End Function
Public Shared Operator =(VersNum1 As VersionNumber,
VersNum2 As VersionNumber) As Boolean
Return VersNum1._version.Equals(VersNum2._version)
End Operator
Public Shared Operator <>(VersNum1 As VersionNumber, VersNum2 As VersionNumber) As Boolean
Return Not VersNum1._version.Equals(VersNum2._version)
End Operator
Public Shared Operator >(VersNum1 As VersionNumber, VersNum2 As VersionNumber) As Boolean
Return VersNum1._version > VersNum2._version
End Operator
Public Shared Operator <(VersNum1 As VersionNumber, VersNum2 As VersionNumber) As Boolean
Return VersNum1._version < VersNum2._version
End Operator
Public Shared Operator >=(VersNum1 As VersionNumber, VersNum2 As VersionNumber) As Boolean
Return VersNum1 > VersNum2 OrElse VersNum1.Equals(VersNum2)
End Operator
Public Shared Operator <=(VersNum1 As VersionNumber, VersNum2 As VersionNumber) As Boolean
Return VersNum1 < VersNum2 OrElse VersNum1.Equals(VersNum2)
End Operator
#End Region
End Class