문제

정렬하고 싶은 키 값 쌍이 필요하기 때문에 해시 가능 대신 SortedList를 사용하기로 결정했습니다.

아래 순서대로 데이터를 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"은 처음에는 정수였습니다.

예를 들어

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)

불행히도 나는 타임 슬롯을 변경할 수없는 두 정수 값으로받습니다.

SortedDist에 종류를 강요 할 수있는 방법이 있습니까? 아니면이 문제가 내 키를 저장하는 방식 때문에이 문제입니까? 그것을 보관하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

a 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 자리 미만의 시간은 4 자리가있는 길이와 같은 길이를 만들기 위해 0 ( '0')으로 접두사를해야합니다. 이렇게하면 표준 비교가 문자열 1의 숯 1을 비교할 것입니다.이 문자열 1은 이제 1이 될 문자열 2의 0에서 char 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