2012-04-02 3 views
3

Ich habe einige Daten in dieser Form (Wörterbuch):Finden welcher Bereich ändert sich der Wert liegen in einem Wörterbuch

Value0 Text1 
Value1 Text2 
Value2 Text3 
Value3 Text4 
Value4 Text5 

ich nun eine Schleife durch eine Anordnung haben, die jede beliebige Werte haben können.

foreach value in random array 
{ 
    if value is between (value0 && value1) 
    console.writeline(Text1) 
    if value is between (value1 && value2) 
    console.writeline(Text2) 
    if value is between (value2 && value3) 
    console.writeline(Text3) 
    if value is between (value3 && value4) 
    console.writeline(Text4) 
} 

Das Problem, das ich hier bin vor, dass die für jeden Wert des Feldes, soll ich in der Lage sein zu erkennen, was reicht es (größer als Wert 0 und kleiner als Wert 1) ist, und damit den bekomme entsprechend Text. Aber, das Wörterbuch ist keine Konstante und kann eine beliebige Anzahl von Werten haben und daher kann ich diese nicht, wenn die Bedingungen wie oben sind. (Für zB: das Wörterbuch könnte einen anderen Eintrag haben Value5 Text6)

was wäre eine anständige Möglichkeit, dies zu tun?

+0

Sie wollen ein geordnetes Wörterbuch verwenden dann durch den Satz von Einträgen durchlaufen das letzte Schlüssel-Wert-Paar zu erinnern, dass Ihr Wert kleiner als oder gleich zu. Sobald Sie einen Schlüssel finden, der größer ist als Ihr Wert, halten Sie an und kehren Sie zurück. Allerdings weiß ich nicht, was die beste C# -Datenstruktur dafür ist - SortedList? Oder Sie können die Schlüssel aus einem anderen Wörterbuchtyp extrahieren, sortieren und durchlaufen. (Idealerweise möchten Sie den Größt-Kleiner-als-Schlüssel finden, ohne eine vollständige Iteration durchzuführen, beispielsweise einen Baumspaziergang, aber ich kenne keine Datenstrukturimplementierung, die dies auch tut.) – Rup

Antwort

3

Sie können dies nicht mit einem Dictionary<TKey,TValue> tun, weil es nicht die Elemente darin geordnet hält. Aber man kann ein SortedDictionary<TKey, TValue> (oder ein SortedList<TKey, TValue>), dies zu tun:

TValue GetValue<TKey, TValue>(SortedDictionary<TKey, TValue> dictionary, TKey key) 
{ 
    var comparer = dictionary.Comparer; 

    TValue result = default(TValue); 

    foreach (var kvp in dictionary) 
    { 
     if (comparer.Compare(key, kvp.Key) < 0) 
      return result; 

     result = kvp.Value; 
    } 

    return result; 
} 
Verwandte Themen