【问题标题】:Can an ArrayList of objects be sorted by a custom method in VBScript?可以通过 VBScript 中的自定义方法对对象的 ArrayList 进行排序吗?
【发布时间】:2014-07-31 21:09:51
【问题描述】:

首先 - 我使用的语言是 VBScript,与 Windows Scripting Host 一起使用。我真的没有选择改变它并使用其他东西。

此时,我有许多具有多个字段的记录,从文件中读取。我想以多种顺序将它们打印出来(首先,按字母顺序;其次,按位置分组,然后在位置内按字母顺序排序;等等)。记录存储在 ArrayList 中。

如果我使用的是 Visual Basic 而不是 VBScript,我知道我可以创建实现 iComparer 接口的类,然后在我想按该顺序排序时使用适当类的对象调用 ArrayList 的 Sort 函数(第一个排序使用 Alphabetical 对象,第二个排序使用 LocationThenAlphabetical 对象,等等)

但是,我一直在疯狂地尝试在 VBScript 中找到一种方法来实现这一点或任何类似的东西,这是我实际上可以使用的语言。我用谷歌搜索了“VBScript”、“ArrayList”、“sort”、“custom sort”、“comparison”、“custom comparison”、“implements”、“interface”的无穷组合——但每当我找到与 VBScript 相关的结果时,它们不是关于如何进行自定义排序,每当我发现与自定义排序相关的结果时,它们都不适用于 VBScript,即使在我的搜索中明确指定。

如果可能的话,我宁愿以正确的方式做到这一点。如果根本不可能在 VBScript 中进行自定义排序,我可以看到一个可能的解决方法,但它会增加很多复杂性并使用比我认为自定义排序更多的内存。

【问题讨论】:

    标签: sorting arraylist vbscript


    【解决方案1】:

    鉴于您必须将 System.Collections.IComparer 传递给 .Sort 方法,并且您不能在 VBScript 中创建 .NET 对象,因此答案是否定的。

    【讨论】:

    • VBScript 可以从.Net 创建类和使用对象,所以肯定有办法。如果“列表”不是 VBScript 所固有的,而是通过以下方式创建的:dim list: Set list = CreateObject("System.Collections.ArrayList") 但也许是因为 VBScript 中缺少其他功能——比如使用类型和实现接口的能力? (此 VB.Net 示例需要:VB.net Sort Arraylist By Objects Name
    【解决方案2】:

    关于解决方法。您可以使用 JScript 轻松进行自定义排序。即使仅限于 WSH VBScript,您也可以实例化 MSScriptControl.ScriptControl,将其语言设置为 JScript,创建能够通过 VBS 从文件接收所有必要数据到 JS 数组的东西,然后使用 arrayObj.sort( [sortFunction] ) 进行排序function sortFunction(a, b){} 作为比较器。

    【讨论】:

      【解决方案3】:
      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
      

      这是使用断开连接的记录集对文件进行排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-21
        • 2011-02-16
        相关资源
        最近更新 更多