首先 - 我使用的语言是VBScript,与Windows Scripting Host一起使用。我真的没有选择改变它并使用别的东西。
此时,我有多个具有多个字段的记录,从文件中读入。我想以多种顺序打印出来(首先,按字母顺序排列;其次,按位置分组,然后按位置按字母顺序排序;等等)。记录存储在ArrayList中。
如果我使用的是Visual Basic而不是VBScript,我知道我可以创建实现iComparer接口的类,然后当我想按顺序排序时,用适当类的对象调用ArrayList的Sort函数(首先使用Alphabetical对象,第二种使用LocationThenAlphabetical对象,等等。)
然而,我一直在疯狂地试图在VBScript中找到一种方法来做到这一点或类似的东西,这是我实际可以使用的语言。我用Google搜索了#34; VBScript"," ArrayList"," sort","自定义排序","比较","自定义比较","实现","接口" - 但每当我发现与VBScript相关的结果时,他们都不知道如何进行自定义排序,每当我发现与自定义排序相关的结果时,它们都不适用于VBScript,即使明确指定了在我的搜索中。
如果可能的话,我宁愿以正确的方式做到这一点。如果它根本不可能在VBScript中进行自定义排序,我可以看到一种可能的解决方法,但它会增加很多复杂性并且使用比我认为自定义排序更多的内存。 / p>
答案 0 :(得分:1)
鉴于您必须将System.Collections.IComparer传递给.Sort方法,并且您无法在VBScript中创建.NET对象,答案是否定的。
答案 1 :(得分:1)
关于解决方法。您可以使用JScript轻松进行自定义排序。即使仅限于WSH VBScript,您也可以实例化MSScriptControl.ScriptControl
,将其语言设置为JScript,创建能够通过VBS从文件接收所有必要数据到JS数组的内容,然后使用{{进行排序1}}使用arrayObj.sort( [sortFunction] )
作为比较器。
答案 2 :(得分:0)
Set rs = CreateObject("ADODB.Recordset")
With rs
.Fields.Append "SortKey", 201, 260
.Fields.Append "Txt", 201, 5000
.Open
Do Until Inp.AtEndOfStream
Lne = Inp.readline
SortKey = Mid(Lne, Arg(3), Arg(4) - Arg(3))
.AddNew
.Fields("SortKey").value = SortKey
.Fields("Txt").value = Lne
.UpDate
Loop
If Arg(2) = "a" then SortColumn = "SortKey ASC"
If Arg(2) = "d" then SortColumn = "SortKey DESC"
.Sort = SortColumn
Do While not .EOF
Outp.writeline .Fields("Txt").Value
.MoveNext
Loop
End With
这是使用断开连接的记录集对文件进行排序。