2009-03-24 3 views
1

У меня есть необходимость в ключевой паре значений, которую я хочу сортировать, поэтому я решил использовать SortedList вместо HashTable.СортировкаList не сортировка по ключу - VB.NET

Я добавляю данные в порядке ниже мою SortedList, который является заказом мне это нужно в

 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) 

Ключ представляет собой строку и значение является списком объектов. Ключ представляет собой временной интервал, который был объединен из двух целых значений и ограничен с помощью «-». «700» в качестве строки было 0700 изначально целым числом.

например.

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

Но как только эти ключевые пары значений добавляются в SortedList они появляются в порядке

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) 

К сожалению, я получаю времена слотов как два целочисленных значения, которые не могут быть изменены.

Есть ли способ заставить сортировку сортировать список? или это проблема из-за того, как я храню свой ключ? Есть ли лучший способ сохранить его?

ответ

7

Создайте SortedList(Of String, List(Of Object)), но перейдите в IComparer(Of String) в constructor, где реализация будет сравнивать ключи в соответствии с желаемым заказом.

Вам придется реализовать это самостоятельно, но это не должно быть слишком сложно - просто разделите строку на «-», проанализируйте обе стороны с помощью Int32.Parse и отреагируйте соответствующим образом. Возможно, вам даже не придется беспокоиться о части после «-», если ваши диапазоны клавиш не перекрываются.

EDIT: Вот демо-версия. Он только распечатывает ключи, но этого достаточно, чтобы показать, что они отсортированы по своему желанию.

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

Спасибо Jon Вы это означает, что, когда я добавляю ключ, как указано в посте выше, что я делаю следующее при добавлении его к SortedList sortedlist.Add (key.ToString (Новый Comparer (implemtation здесь), Список (Of Object)) Как я никогда не использовал IComparer, не могли бы вы привести пример? – w4ymo

+0

Нет - вы предоставляете IComparer (T) при создании SortedList.Следуйте за ссылкой, которую я предоставил для слова «конструктор» :) Я не могу привести пример прямо сейчас, поскольку мне нужно приготовить обед, а мой VB ужасен. Вы могли бы следовать примеру C#? –

+0

Эй, Джон, не понимал, что есть ссылки. Я все еще новичок в макете переполнения стека :) Да, это было бы здорово. Я программист aC# по профессии только в компании, которая нуждается в vb.net. – w4ymo

1

Похоже, что вы сортируете его в алфавитном порядке вместо численного. Вам нужно будет сделать свой ключевой номер, чтобы получить порядок сортировки, который вы ищете.

+0

Nope, SortedList позволяет легко настраивать заказы на сортировку. –

-1

может ключи десятичное и выглядят как

7.08 
9.1 
11.12 
17.18 
19.20 

и конвертировать и формат строки по мере необходимости.

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 
1

Времена, которые менее чем 4 цифр должны быть с префиксом нулем («0»), чтобы сделать им такую ​​же длину, как и те, с 4-х цифр. Таким образом, стандартный сравнитель будет сравнивать символ 1 строки 1, который теперь будет 0 до символа 1 строки 2, который будет 1, а первая строка выйдет первой.

Смежные вопросы