Domanda

Ho un bisogno di coppia di valori chiave che desidero ordinare così ho deciso di utilizzare un SortedList invece di un HashTable.

Io sono l'aggiunta dei dati nel seguente ordine alla mia SortedList, che è l'ordine che ho bisogno in

     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 chiave è una stringa e il valore è un elenco di oggetti. La chiave è che rappresenta un intervallo di tempo che è stato concatenato da due valori interi e delimitata da "-". "700" come una stringa era 0700 inizialmente un numero intero.

per es.

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

Ma una volta che queste coppie di valori chiave sono aggiunti alla SortedList compaiono nell'ordine

 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)

Purtroppo ricevo i tempi slot come due valori interi che non possono essere modificati.

C'è un modo per forzare una sorta su un SortedList? o è questo problema a causa del modo in cui sto Memorizzazione mia chiave? C'è un modo migliore per conservarlo?

È stato utile?

Soluzione

Crea un SortedList(Of String, List(Of Object)) ma passano in un IComparer(Of String) al costruttore , in cui l'attuazione confronterà i tasti secondo l'ordine che si desidera.

Dovrai implementare che da soli, ma non dovrebbe essere troppo difficile - basta dividere la stringa da '-', analizzare entrambi i lati con Int32.Parse e reagire di conseguenza. Non si può nemmeno bisogno di preoccuparsi per la parte dopo il '-'., Se i campi di chiave sono non-sovrapposizione

EDIT: Ecco una demo. Si stampa solo le chiavi, ma questo è sufficiente a dimostrare che stanno ordinati come li volete.

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

Altri suggerimenti

Sembra che si sta smistamento alfabetico invece di numerico. Si dovrebbe rendere il vostro tasto numerico per ottenere il tipo di ordinamento che stai cercando.

Times che sono meno di 4 cifre lungo è necessario essere preceduto da uno zero ( '0') per renderli la stessa lunghezza quelli con 4 cifre. In questo modo, l'operatore di confronto standard sarà confrontare char 1 corda 1 che ora sarà da 0 a 1 char di stringa 2, che sarà un 1, e la stringa 1 uscirà prima.

potrebbero essere le chiavi decimale e guardare come

7.08
9.1
11.12
17.18
19.20

e convertire e il formato di stringa come necessario.

    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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top