Pergunta

Eu tenho uma necessidade de par de valores-chave que gostaria de classificar, então eu decidi usar um SortedList em vez de um HashTable.

Estou adicionando os dados na ordem a seguir à minha SortedList que é a ordem que eu precisar dele no

     Key          | Value
     --------------------------------
 1   "700-800"    | List(Of Object)
 2   "900-1000"   | List(Of Object)
 3   "1100-1200"  | List(Of Object)
 4   "1700-1800"  | List(Of Object)
 5   "1900-2000"  | List(Of Object)

A chave é uma string eo valor é uma lista de objetos. A chave está representando um intervalo de tempo que tem sido concatenado a partir de dois valores inteiros e delimitado por "-". "700" como uma string foi 0700 inicialmente um inteiro.

por exemplo.

Dim key As String = slotTimeStart.ToString() & "-" & slotTimeEnd.ToString()

Mas uma vez que estes pares de valores-chave são adicionados ao SortedList aparecem na ordem

 3   "1100-1200"  | List(Of Object)
 4   "1700-1800"  | List(Of Object)
 5   "1900-2000"  | List(Of Object)
 1   "700-800"    | List(Of Object)
 2   "900-1000"   | List(Of Object)

Infelizmente eu recebo os slots vezes como dois valores inteiros que não podem ser alterados.

Existe alguma maneira de forçar uma espécie em um SortedList? ou é este problema por causa da maneira que eu sou armazenar a minha chave? Existe uma maneira melhor para armazená-lo?

Foi útil?

Solução

Criar um SortedList(Of String, List(Of Object)) mas passar em uma IComparer(Of String) para o construtor , onde a implementação irá comparar as chaves de acordo com a ordem que quiser.

Você vai ter que implementar esse mesmo, mas não deve ser muito difícil - apenas dividir a seqüência de caracteres '-', analisar ambos os lados com Int32.Parse e reagir em conformidade. Você mesmo pode não precisar se preocupar com a parte depois do '-'., Se os seus intervalos de chaves são não-sobreposição

EDIT: Aqui está uma demonstração. Ele só imprime as chaves, mas isso é suficiente para mostrar que eles estão classificadas como quiser.

using System;
using System.Collections.Generic;

public class Test
{
    static void Main(string[] args)
    {
        var list = new SortedList<string, int>(new RangeComparer());
        list.Add("900-1000", 10);
        list.Add("1100-1200", 20);
        list.Add("700-800", 30);
        list.Add("1700-18000", 40);
        list.Add("1900-2000", 50);

        foreach (var entry in list)
        {
            Console.WriteLine(entry.Key);
        }
    }
}

public class RangeComparer : IComparer<string>
{
    private static int ParseStartOfRange(string range)
    {
        int hyphenIndex = range.IndexOf('-');
        // Normally do some error checking in case hyphenIndex==-1
        string firstPart = range.Substring(0, hyphenIndex);
        return int.Parse(firstPart);
    }

    public int Compare(string first, string second)
    {
        // In real code you would probably add nullity checks
        int firstStart = ParseStartOfRange(first);
        int secondStart = ParseStartOfRange(second);
        return firstStart.CompareTo(secondStart);
    }
}

Outras dicas

Parece que você está classificando-o em ordem alfabética em vez de numericamente. Você teria que fazer o seu numérica chave para obter a ordem de classificação que você está procurando.

Times que são menos de 4 dígitos precisam ser prefixados com um zero ( '0') para torná-los o mesmo comprimento que os únicos com 4 dígitos. Dessa forma, o comparador padrão irá comparar CHAR 1 de corda 1, que será agora um 0 para char 1 de corda 2, que será a 1, e corda 1 vai sair em primeiro lugar.

poderia ser as chaves decimal e olhar como

7.08
9.1
11.12
17.18
19.20

e converter e formato a corda conforme necessário.

    Dim sl As New SortedList(Of Decimal, Object)
    'sample data
    For x As Integer = 7 To 20 Step 2
        sl.Add(CDec(x + ((x + 1) / 100)), New Object)
    Next

    Dim aKey As Decimal
    Dim slotStart As DateTime = #1:00:00 PM#
    Dim slotEnd As DateTime = #2:00:00 PM#

    aKey = CDec(slotStart.Hour + (slotEnd.Hour / 100))
    sl.Item(aKey) = New Object
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top