1

我需要要排序的键值对,所以我决定使用 SortedList 而不是 HashTable。

我按以下顺序将数据添加到我的 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)

不幸的是,我将时隙作为两个无法更改的整数值接收。

有没有办法强制对 SortedList 进行排序?或者这个问题是因为我存储密钥的方式?有没有更好的存储方法?

4

4 回答 4

7

创建一个SortedList(Of String, List(Of Object))但将 an 传递IComparer(Of String)构造函数,其中实现将根据您想要的顺序比较键。

你必须自己实现它,但这不应该太难 - 只需用'-'分割字符串,解析两边Int32.Parse并做出相应的反应。如果您的键范围不重叠,您甚至可能不需要担心“-”之后的部分。

编辑:这是一个演示。它只打印出密钥,但这足以表明它们已按照您的需要进行排序。

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);
    }
}
于 2009-03-24T21:53:26.853 回答
1

看起来您是按字母顺序而不是按数字排序。您必须将密钥设为数字才能获得所需的排序顺序。

于 2009-03-24T21:50:24.927 回答
1

长度小于 4 位的时间需要以零 ('0') 为前缀,以使其与 4 位的长度相同。这样,标准比较器会将字符串 1 的字符 1(现在将是 0)与字符串 2 的字符 1(将是 1)进行比较,字符串 1 将首先出现。

于 2009-06-22T10:45:17.220 回答
-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
于 2009-03-24T23:16:50.757 回答