Once you store a numbers as a string it cannot act as a number any longer because it is a numeral (a character representing a number). This is especially true of sorting where "9" will evaluate greater than "10000" everytime. Rather than a string array, use a utility class to store the Name and Value as a NamedValuePair:
Public Class NVP
Public Property Name As String
Public Property Value As Integer
Public Sub New(n As String, v As Integer)
Name = n
Value = v
End Sub
Public Overrides Function ToString() As String
Return String.Format("{0} ({1})", Name, Value.ToString)
End Function
End Class
Then store those in your list:
Private myList As New List(Of NVP)
For a simple sort on the value member:
' populate some fake data
myList.Add(New NVP("Ziggy", 6))
myList.Add(New NVP("Apple", 1))
myList.Add(New NVP("Zebra", 152))
myList.Add(New NVP("Zoey", 7))
' Sort or OrderBy are not methods, so create a new list in the desired order:
myList = myList.OrderBy(Function(x) x.Value).ToList()
The NVP class can be very handy for a lots of situations. To make it even more useful, define it as Generic so it can be declared as string/decimal or string/Date, string Point etc etc etc:
Public Class NVP(Of T)
Public Property Name As String
Public Property Value As T
Public Sub New(n As String, v As T)
Name = n
Value = v
End Sub
Public Overrides Function ToString() As String
Return String.Format("{0} ({1})", Name, Value.ToString)
End Function
End Class
Usage:
Dim foo As New NVP(Of Integer)(strName, intVal) ' int type
Dim myList As New List(Of NVP(Of Double)) ' double type
Of String()means both items are strings - no numbers. If the values (numbers) are unique you could use a SortedDictionary(Of int, string) otherwise to retain the value you will need a class for your list