w4y*_*ymo 1 vb.net icomparer sortedlist
我需要键值对,我希望排序,所以我决定使用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)
Run Code Online (Sandbox Code Playgroud)
键是一个字符串,值是一个对象列表.键是表示从两个整数值连接并由" - "分隔的时隙.作为字符串的"700"最初是0700整数.
例如
Dim key As String = slotTimeStart.ToString() & "-" & slotTimeEnd.ToString()
Run Code Online (Sandbox Code Playgroud)
但是,一旦将这些键值对添加到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)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我将时隙视为两个无法更改的整数值.
有没有办法强制排序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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8286 次 |
| 最近记录: |