Key -vb.net에서 정렬하지 않는 SortedList
-
21-08-2019 - |
문제
정렬하고 싶은 키 값 쌍이 필요하기 때문에 해시 가능 대신 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