作为预告片(另见ArrayList、Disconnected Recordset 和 ArrayList):
Dim aTest : aTest = Array( _
". Z 0" _
, ", B 2" _
, "? A 1" _
)
WScript.Echo "----- ArrayList"
WScript.Echo "original data: ", "[""" & Join(aTest , """ """) & """]"
WScript.Echo "AL: (full) ", "[""" & Join(sortAL(aTest) , """ """) & """]"
WScript.Echo "AL: (numerical) ", "[""" & Join(sortAL(Array(12, 9, -1)) , """ """) & """]"
WScript.Echo "AL: (dates) ", "[""" & Join(sortAL(Array(Now + 5, Now - 5)), """ """) & """]"
WScript.Echo "AL: (Mid(elm,3,1))", "[""" & Join(sortAL_31(aTest) , """ """) & """]"
WScript.Echo "----- Disconnected Recordset"
WScript.Echo "DRS: (Mid(elm,3,1))", "[""" & Join(sortDRS_Substring(aTest, 3, 1) , """ """) & """]"
WScript.Echo "DRS: (Mid(elm,5,1))", "[""" & Join(sortDRS_Substring(aTest, 5, 1) , """ """) & """]"
' ArrayList.Sort handles homogenous arrays of simple types just fine,
' but looks at the element in full. For other cases, you need extra work
' or ADO
Function sortAL(aX)
Dim al : Set al = CreateObject("System.Collections.ArrayList")
Dim elm
For Each elm In aX
al.Add elm
Next
al.Sort
sortAL = al.ToArray()
End Function
' Extra work: feeding pre-processed data to the ArrayList; hardcoded
Function sortAL_31(aX)
Const csSep = ":"
Dim al : Set al = CreateObject("System.Collections.ArrayList")
ReDim a(UBound(aX))
Dim elm
For Each elm In aX
al.Add Mid(elm, 3, 1) & csSep & elm
Next
al.Sort
For elm = 0 To UBound(a)
a(elm) = Split(al(elm), csSep)(1)
Next
sortAL_31 = a
End Function
' more flexible: ADO DRS + a start at parametrization; handling different
' types is left as an exercise
Function sortDRS_Substring(aX, nFrom, nLen)
Const adVarChar = 200 ' 000000C8
Const adClipString = 2 ' 00000002
Const csSep = ":"
ReDim a(Ubound(aX))
Dim oRS : Set oRS = CreateObject("ADODB.Recordset")
oRS.Fields.Append "FORG", adVarChar, 250
oRS.Fields.Append "FSUB", adVarChar, 250
oRS.Open
Dim elm
For Each elm In aX
oRS.AddNew
oRS.Fields("FORG").value = elm
oRS.Fields("FSUB").value = Mid(elm, nFrom, nLen)
oRS.UpDate
Next
oRS.Sort = "FSUB"
oRS.MoveFirst
For elm = 0 To UBound(a)
a(elm) = oRS.Fields("FORG").value
oRS.MoveNext
Next
sortDRS_Substring = a
End Function
输出:
----- ArrayList
original data: [". Z 0" ", B 2" "? A 1"]
AL: (full) [", B 2" ". Z 0" "? A 1"]
AL: (numerical) ["-1" "9" "12"]
AL: (dates) ["1/23/2013 5:00:22 PM" "2/2/2013 5:00:22 PM"]
AL: (Mid(elm,3,1)) ["? A 1" ", B 2" ". Z 0"]
----- Disconnected Recordset
DRS: (Mid(elm,3,1)) ["? A 1" ", B 2" ". Z 0"]
DRS: (Mid(elm,5,1)) [". Z 0" "? A 1" ", B 2"]