Pergunta

É uma questão muito simples -? Como posso ordenar uma coleção

Eu tenho um arquivo CSV com linhas em uma ordem aleatória. Eu gostaria de classificar as linhas de acordo com a data em uma coluna. Faço para adicionar as linhas a um conjunto de registros? Posso tipo com um Scripting.Dictionary?

Eu claramente sido estragado com .NET e Linq, e agora eu me encontro de volta na terra de asp clássico, percebendo que eu devia ter sabido disso há 7 anos, e os genéricos falta imensamente. Eu me sinto como um n00b completo.

Foi útil?

Solução

Neste caso, eu iria começar a ajuda de grande .net irmão. É possível usar System.Collections.SortedList dentro de seu ASP aplicativo e obter os seus pares de valores-chave classificadas.

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

Btw, se as seguintes classes .net estão disponíveis também:

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

Veja também: Maravilhas do COM. NET interoperabilidade

Outras dicas

Eu iria com a abordagem de registros. Use o controlador de texto. Você vai precisar para mudar o diretório na cadeia de conexão e o nome do arquivo na instrução select. a propriedade estendida "HDR = Yes" especifica que não há uma linha de cabeçalho no CSV que sugiro como ele vai fazer a escrever o SQL pseudo mais fácil.

<%

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

%>

Tem sido um longo tempo para mim também. IIRC você não tem uma opção fora da caixa.

Se eu fosse você eu colocar todos os dados em uma matriz e, em seguida, classificar a matriz. Eu encontrei uma implementação QuickSort aqui: http://www.4guysfromrolla.com/webtech/012799 -3.shtml

Também olhar para o "Bubble Sort", funciona excelente com aqueles clássico tag asp nuvem.

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

A resposta final de tarde para isso, mas ainda de valor.

Eu estava trabalhando com pequenas coleções de modo podia pagar a abordagem onde eu inserido o item no lugar correto em cada ocasião, efetivamente reconstruir a coleção em cada adição.

A classe VBScript é a seguinte:

'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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top