代码之家  ›  专栏  ›  技术社区  ›  harriyott Erik Funkenbusch

在经典ASP中对集合进行排序

  •  7
  • harriyott Erik Funkenbusch  · 技术社区  · 17 年前

    我有一个CSV文件,其中的行以随机顺序排列。我想根据一列中的日期对行进行排序。是否将行添加到记录集中?我可以用脚本字典排序吗?

    显然,我已经被.NET和Linq宠坏了,现在我发现自己回到了经典asp的国度,意识到我7年前肯定知道这一点,并且非常想念泛型。我觉得自己像一个完整的n00b。

    5 回复  |  直到 17 年前
        1
  •  17
  •   Sam Hanley    10 年前

    在这种情况下,我会得到老大哥.net的帮助。可以使用 System.Collections.Sortedlist

    set list = server.createObject("System.Collections.Sortedlist")
    with list
      .add "something", "YY"
      .add "something else", "XX"
    end with
    
    for i = 0 to list.count - 1
        response.write(list.getKey(i) & " = " & list.getByIndex(i))
    next
    

    顺便说一句,如果以下.net类也可用:

    • System.Collections.Queue
    • System.Collections.Stack
    • System.Collections.ArrayList
    • System.Collections.SortedList
    • System.Collections.Hashtable
    • System.IO.StringWriter
    • System.IO.MemoryStream;

    另见: Marvels of COM .NET interop

        2
  •  3
  •   Wayne    17 年前

    <%
    
    Dim strConnection, conn, rs, strSQL
    
    strConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\inetpub\wwwroot\;Extended Properties='text;HDR=Yes;FMT=Delimited';"
    
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open strConnection
    
    Set rs = Server.CreateObject("ADODB.recordset")
    strSQL = "SELECT * FROM test.csv order by date desc"
    rs.open strSQL, conn, 3,3
    
    WHILE NOT rs.EOF
        Response.Write(rs("date") & "<br/>") 
        rs.MoveNext
    WEND
    
    rs.Close
    Set rs = Nothing
    
    conn.Close
    Set conn = Nothing
    
    %>
    
        3
  •  0
  •   rslite    17 年前

    对我来说也有很长一段时间了。IIRC你没有现成的选择。

    如果我是你,我会把所有数据放在一个数组中,然后对数组进行排序。我在这里找到了一个快速排序实现: http://www.4guysfromrolla.com/webtech/012799-3.shtml

        4
  •  0
  •   Saif Khan    17 年前

    还可以看看“气泡排序”,它与那些经典的asp标记云非常配合。

    http://www.4guysfromrolla.com/webtech/011001-1.shtml

        5
  •  0
  •   Mutation Person    13 年前

    这是一个迟来的答案,但仍然有价值。

    VBScript类如下所示:

    'Simple collection manager class.
    'Performs the opration of adding/setting a collection item.
    'Encapulated off here in order to delegate responsibility away from the collection class.
    Class clsCollectionManager
        Public Sub PopulateCollectionItem(collection, strKey, Value)
            If collection.Exists(strKey) Then
                If (VarType(Value) = vbObject) Then
                    Set collection.Item(strKey) = Value
                Else
                    collection.Item(strKey) = Value
                End If
            Else
                Call collection.Add(strKey, Value)
            End If
        End Sub
    
        'take a collection and a new element as input parameters, an spit out a brand new collection 
        'with the new item iserted into the correct location by order
        'This works on the assumption that the collection it is receiving is already ordered 
        '(which it should be if we always use this method to populate the item)
    
        'This mutates the passed collection, so we highlight this by marking it as byref 
        '(this is not strictly necessary as objects are passed by reference anyway)
        Public Sub AddCollectionItemInOrder(byref existingCollection, strNewKey, Value)
            Dim orderedCollection: Set orderedCollection = Server.CreateObject("Scripting.Dictionary")
            Dim strExistingKey
    
            'If there is something already in our recordset then we need to add it in order.
    
            'There is no sorting available for a collection (or an array) in VBScript. Therefore we have to do it ourself.
            'First, iterate over eveything in our current collection. We have to assume that it is itself sorted.
            For Each strExistingKey In existingCollection
    
                'if the new item doesn't exist AND it occurs after the current item, then add the new item in now 
                '(before adding in the current item.)
                If (Not orderedCollection.Exists(strNewKey)) And (strExistingKey > strNewKey) Then
                    Call PopulateCollectionItem(orderedCollection, strNewKey, Value)
                End If
                Call PopulateCollectionItem(orderedCollection, strExistingKey, existingCollection.item(strExistingKey))
            Next
    
            'Finally check to see if it still doesn't exist. 
            'It won't if the last place for it is at the very end, or the original collection was empty
            If (Not orderedCollection.Exists(strNewKey)) Then
                Call PopulateCollectionItem(orderedCollection, strNewKey, Value)
            End If
    
            Set existingCollection = orderedCollection
        End Sub
    End Class
    
    推荐文章