我有一个需要关键的价值对,我希望排序所以我决定用一个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?或是这个问题,因为我的方式储存我的钥匙?是否有更好的方式来储存它吗?

有帮助吗?

解决方案

创建一个 SortedList(Of String, List(Of Object)) 但是,通过一个 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);
    }
}

其他提示

它看起来像你整理它,而不是按字母顺序排列的数字。你必须让你的数字键让你正在寻找的排序顺序。

时报是小于4位长需要与一个零前缀(“0”),以使它们具有相同的长度,与4位的那些。通过这种方式,比较器标准将比较串1的炭1现在将是一个0到char串2的1这将是一个1,并串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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top