1

ソートしたいキーと値のペアが必要なので、HashTable の代わりに 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)

キーは文字列で、値はオブジェクトのリストです。キーは、2 つの整数値を連結し、「-」で区切ったタイムスロットを表しています。文字列としての「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)

残念ながら、タイムスロットは変更できない 2 つの整数値として受け取ります。

SortedList で並べ替えを強制する方法はありますか? または、この問題はキーの保管方法が原因ですか? 保存する良い方法はありますか?

4

4 に答える 4

7

ただし、コンストラクター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);
    }
}
于 2009-03-24T21:53:26.853 に答える
1

数値ではなくアルファベット順に並べ替えているようです。探している並べ替え順序を取得するには、キーを数値にする必要があります。

于 2009-03-24T21:50:24.927 に答える
1

4 桁未満の時間は、4 桁の時間と同じ長さにするには、ゼロ (「0」) を前に付ける必要があります。そうすれば、標準の比較子は文字列 1 の文字 1 (現在は 0) と文字列 2 の文字 1 (文字列 1) を比較し、文字列 1 が最初に出力されます。

于 2009-06-22T10:45:17.220 に答える