2009-03-24 5 views
1

ソートするキーの値のペアが必要なので、HashTableではなくSortedListを使用することにしました。SortedListはキーでソートされていません - VB.NET

私は

 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) 

で、私はそれを必要とするための鍵は、文字列で、値はオブジェクトのリストである私のSortedListのに以下の順序でデータを追加しています。キーは、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にソートを強制する方法はありますか?私の鍵を保管しているためにこの問題になっていますか?それを保存するより良い方法はありますか?

答えて

7

SortedList(Of String, List(Of Object))を作成しますが、IComparer(Of String)constructorに渡します。実装では、必要な順序に従ってキーが比較されます。

これを自分で実装する必要がありますが、それほど難しいことではありません。文字列を ' - 'で分割し、両側をInt32.Parseで解析してそれに応じて反応させます。キー範囲が重複していない場合、 ' - 'の後の部分については心配する必要はないかもしれません。

EDIT:デモです。キーを印刷するだけですが、それはソートされていることを示すだけで十分です。

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); 
    } 
} 
+0

ありがとうございました 上記の投稿に指定されているキーを追加するときに、SortedListに追加するときに次のことを行うことを意味しますか。 sortedlist.Add(Key.ToString(new Comparer(implemtation here))、List (Of Object)) IComparerを使用したことがないので、例を挙げてください。 – w4ymo

+0

いいえ - SortedListを作成するときにIComparer(T)を指定します。私が "コンストラクタ"という単語のために私が提供したリンクに従ってください:)私はいくつかの夕食を調理する必要があるので、今の例を提供することはできません - そして私のVBは恐ろしいです。あなたはC#の例に従うことができるでしょうか? –

+0

ちょっとジョンは、リンクがあったことを認識していませんでした私はまだスタックオーバーフローのレイアウトに新しいです:)はい、それはvb.netを必要とする会社で貿易だけで#プログラマープログラマーです – w4ymo

1

数字の代わりにアルファベット順に並べ替えるようです。探しているソート順を取得するには、キー数値を入力する必要があります。

+0

いいえ、SortedListでは、カスタムソートオーダーを簡単に行うことができます。 –

-1

キーは10進数と

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 
1

それら4桁のものと同じ長さにするために、ゼロ(「0」)を前置する4桁未満の長い必要ですタイムズ。このようにして、標準比較関数は、文字列1のchar 1と​​0となる文字列2のchar 1を比較し、文字列1が最初に出てきます。

関連する問題