我需要键值对,我希望排序,所以我决定使用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(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 { 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); } }