Frage

Ich habe einen die Notwendigkeit für Schlüsselwertpaar, die ich wünschte, zu sortieren, so habe ich beschlossen, einen SortedList anstelle einer HashTable zu verwenden.

Ich füge die Daten in der folgenden Reihenfolge meiner SortedList, die die Reihenfolge ist, ich es in

brauchen
     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)

Der Schlüssel ist eine Zeichenfolge, und der Wert ist eine Liste von Objekten. Der Schlüssel ist, was einen Zeitschlitz, der von zwei ganzzahligen Werten und begrenzt durch verkettete wurde „-“. „700“ als eine Zeichenfolge war 0700 zunächst eine ganze Zahl.

z.

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

Aber sobald diese Schlüsselwertepaar zum SortedList hinzugefügt werden sie erscheinen in der Reihenfolge

 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)

Leider erhalte ich die Zeitschlitze als zwei Integer-Werte, die nicht geändert werden können.

Gibt es eine Möglichkeit, eine Art auf einem SortedList zu zwingen? oder ist das Problem wegen der Art, wie ich meinen Schlüssel bin Speicherung? Gibt es einen besseren Weg, es zu speichern?

War es hilfreich?

Lösung

Erstellen Sie eine SortedList(Of String, List(Of Object)) aber in einem IComparer(Of String) auf die Konstruktor , wo die Implementierung der Schlüssel nach der Bestellung vergleichen Sie wollen.

Sie werden feststellen, dass selbst implementieren, aber es sollte nicht allzu schwer sein - split nur die Zeichenfolge durch ‚-‘, analysieren beide Seiten mit Int32.Parse und entsprechend reagieren. Sie können sogar müssen nicht um den Teil Sorge nach dem ‚-‘., Wenn Ihre Schlüsselbereiche sind nicht-überlappende

EDIT: Hier ist eine Demo. Er druckt nur die Schlüssel aus, aber das ist genug, um sie geordnet zu zeigen sind, wie Sie sie wollen.

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

Andere Tipps

Es sieht aus wie Sie es alphabetisch statt numerisch zu sortier. Sie müssten Ihren Schlüssel numerischen machen die Sortierreihenfolge, die Sie suchen zu erhalten.

Die Zeiten, die weniger als 4 Ziffern lang Bedarf mit einer Null vorangestellt werden ( ‚0‘) ihnen die gleiche Länge wie die, die mit 4 Ziffern zu machen. Auf diese Weise wird die Standard-comparer char vergleichen 1 von String-1, die jetzt 2 a 0 bis char 1 von Zeichenfolge sein, die eine 1 sein wird, und String-1 wird kommen zuerst.

könnten die Tasten Dezimal und sehen aus wie

7.08
9.1
11.12
17.18
19.20

und konvertiert und Format-String nach Bedarf.

    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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top