排序在传统的ASP集合(Sorting a collection in classic ASP)

2019-07-23 13:54发布

这是一个相当简单的问题 - 我怎么排序的集合?

我有与随机顺序排一个CSV文件。 我想按照一列日期的行进行排序。 难道我行添加到记录? 我可以用一个排序的Scripting.Dictionary?

我已经清楚地被宠坏.NET和LINQ,现在我发现自己回到了传统的ASP的土地上,实现我一定是7年前知道这一点,并且非常缺少泛型。 我觉得自己像一个完整的n00b。

Answer 1:

在这种情况下,我会得到大哥.NET帮助。 有可能你的ASP应用程序中使用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;

另请参阅: COM .NET互操作程序的奇迹



Answer 2:

我会使用Recordset方法去。 使用文本驱动程序。 您需要更改连接字符串中的目录和文件名的select语句。 扩展属性“HDR =是”指定有在CSV标题行,我建议,因为它将使写伪SQL更容易。

<%

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

%>


Answer 3:

这是一个很长一段时间对我来说太。 IIRC你没有开箱的选项。

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



Answer 4:

还看“冒泡排序”,优秀的作品与那些传统的ASP标签云。

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



Answer 5:

逾期末答案,但仍有价值。

我是用小集合工作,所以能买得起,我在正确的位置插在每次项目的办法,有效地重建每个另外的集合。

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


文章来源: Sorting a collection in classic ASP