You'll need to have a Natural Comparison of the strings to get what you're looking for.

Here's a couple of options.

vb.net Code:
  1. Imports System.Text.RegularExpressions
  2.  
  3. Public Class NaturalComparer
  4.     Implements IComparer(Of String)
  5.  
  6.     Private _pos As Integer
  7.     Private ReadOnly _order As Integer
  8.  
  9.     Public Sub New(Optional Ascending As Boolean = True)
  10.         _order = If(Ascending, 1, -1)
  11.     End Sub
  12.  
  13.     Private Shared Function RegexSplit(ByVal s As String) As String()
  14.         Return Regex.Split(s, "(\d+)", RegexOptions.IgnoreCase)
  15.     End Function
  16.  
  17.     Private Shared Function GetEmptyStrings() As Predicate(Of String)
  18.         Return Function(s) String.IsNullOrEmpty(s)
  19.     End Function
  20.  
  21.     Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
  22.         Dim left As New List(Of String)(RegexSplit(x))
  23.         Dim right As New List(Of String)(RegexSplit(y))
  24.  
  25.         left.RemoveAll(GetEmptyStrings())
  26.         right.RemoveAll(GetEmptyStrings())
  27.  
  28.         _pos = 0
  29.         For Each x In left
  30.             If y.Count > _pos Then
  31.                 If Not Decimal.TryParse(x, Nothing) AndAlso Not Decimal.TryParse(right(_pos), Nothing) Then
  32.                     Dim result As Integer = String.Compare(x, right(_pos), True)
  33.                     If result <> 0 Then
  34.                         Return result * _order
  35.                     Else
  36.                         _pos += 1
  37.                     End If
  38.                 ElseIf Decimal.TryParse(x, Nothing) AndAlso Not Decimal.TryParse(right(_pos), Nothing) Then
  39.                     Return -1 * _order
  40.                 ElseIf Not Decimal.TryParse(x, Nothing) AndAlso Decimal.TryParse(right(_pos), Nothing) Then
  41.                     Return 1 * _order
  42.                 Else
  43.                     Dim result = Decimal.Compare(Decimal.Parse(x), Decimal.Parse(right(_pos)))
  44.                     If result = 0 Then
  45.                         _pos += 1
  46.                     Else
  47.                         Return result * _order
  48.                     End If
  49.                 End If
  50.             Else
  51.                 Return -1 * _order
  52.             End If
  53.         Next
  54.  
  55.         Return _order
  56.     End Function
  57. End Class

Or using Api Methods.

vb.net Code:
  1. Public Class ApiNaturalComparer
  2.     Implements IComparer(Of String)
  3.  
  4.     Private Class NativeMethods
  5.         Public Declare Unicode Function StrCmpLogicalW Lib "shlwapi.dll" (s1 As String, s2 As String) As Integer
  6.     End Class
  7.  
  8.     Private ReadOnly _order As Integer
  9.  
  10.     Public Sub New(Optional IsAscending As Boolean = True)
  11.         _order = If(IsAscending, 1, -1)
  12.     End Sub
  13.  
  14.     Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
  15.         Return NativeMethods.StrCmpLogicalW(x, y) * _order
  16.     End Function
  17. End Class

Usage example of both options.

vb.net Code:
  1. Public Class Form1
  2.  
  3.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  4.         Dim MyList = New List(Of String)({"ob1", "ob5", "ob2", "ob3", "ob33", "ob10", "ob1", "ob11", "ob123", "ob20"})
  5.         'MyList.Sort(New NaturalComparer(True))
  6.         'OutputListBox.Items.AddRange(MyList.ToArray())
  7.  
  8.         MyList.Sort(New ApiNaturalComparer(True))
  9.         OutputListBox.Items.AddRange(MyList.ToArray())
  10.     End Sub
  11. End Class