我需要对键值对进行排序,所以我决定使用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整数。
e.g。
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进行排序?还是这个问题是因为我存储密钥的方式?有没有更好的存储方式?
答案 0 :(得分:7)
创建SortedList(Of String, List(Of Object))
,但将IComparer(Of String)
传递给constructor,其中实施将根据您想要的顺序比较密钥。
你必须自己实现它,但它不应该太难 - 只需将字符串拆分为' - ',用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);
}
}
答案 1 :(得分:1)
看起来你按字母顺序而不是数字排序。你必须使你的键数字来获得你正在寻找的排序顺序。
答案 2 :(得分:1)
长度小于4位的时间需要以零('0')为前缀,使其长度与4位数的长度相同。这样,标准比较器将比较字符串1的字符1,它现在是0到字符串2的字符1,它将是1,字符串1将首先出现。
答案 3 :(得分:-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