当前位置:  开发笔记 > 编程语言 > 正文

SortedList没有按键排序 - VB.NET

如何解决《SortedList没有按键排序-VB.NET》经验,为你挑选了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?还是这个问题是因为我存储密钥的方式?有没有更好的存储方式?



1> Jon Skeet..:

创建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);
    }
}

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有