Pregunta

Necesito un par clave-valor que deseo ordenar, así que decidí usar SortedList en lugar de HashTable.

Estoy agregando los datos en el orden siguiente a mi SortedList, que es el orden en el que los necesito.

     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)

La clave es una cadena y el valor es una Lista de objetos.La clave representa un intervalo de tiempo que se ha concatenado a partir de dos valores enteros y delimitado por "-"."700" como cadena era 0700 inicialmente un número entero.

p.ej.

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

Pero una vez que estos pares clave-valor se agregan a SortedList, aparecen en el orden

 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)

Lamentablemente, recibo los intervalos de tiempo como dos valores enteros que no se pueden cambiar.

¿Hay alguna manera de forzar una clasificación en una SortedList?¿O este problema se debe a la forma en que almaceno mi clave?¿Existe una mejor manera de almacenarlo?

¿Fue útil?

Solución

Crear un SortedList(Of String, List(Of Object)) pero pasa en un IComparer(Of String) hacia constructor, donde la implementación comparará las claves según el orden que desee.

Tendrás que implementarlo tú mismo, pero no debería ser demasiado difícil: simplemente divide la cadena por '-', analiza ambos lados con Int32.Parse y reaccionar en consecuencia.Es posible que ni siquiera tengas que preocuparte por la parte después del '-', si tus rangos de teclas no se superponen.

EDITAR:Aquí hay una demostración.Sólo imprime las claves, pero eso es suficiente para mostrar que están ordenadas como usted desea.

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);
    }
}

Otros consejos

Parece que estás de clasificación por orden alfabético en lugar de numéricamente. Usted tendría que hacer su tecla numérica para obtener el orden de clasificación que está buscando.

Los tiempos que están a menos de 4 dígitos de longitud necesidad de ser precedido de un cero ( '0') para que sean la misma longitud que los que tienen 4 dígitos. De esta manera, el comparador estándar comparará Char 1 de cadena 1, que ahora será un 0 a Char 1 de cadena 2, que será un 1, 1 y la cadena va a salir en primer lugar.

podrían ser las claves decimal y parecerse

7.08
9.1
11.12
17.18
19.20

y convertir y el formato de cadena como sea necesario.

    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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top