2012-04-02 89 views
3

我有一些數據以這種形式(字典):查找哪個範圍確實的值位於一個字典

Value0 Text1 
Value1 Text2 
Value2 Text3 
Value3 Text4 
Value4 Text5 

我現在通過其可具有任何隨機值的數組要循環。

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) 
} 

我面臨這裏的問題是,對於所述陣列的每一個值,我應該能夠檢測什麼範圍爲(大於值1大於值0更大和更小),因此得到相應的文本。但是,字典不是一個常數,可以有任意數量的值,因此如果條件如上所述我不能這樣做。 (例如:字典可能有另一個條目Value5 Text6

什麼是一個體面的方式來做到這一點?

+0

你想使用一個有序的字典,然後通過設置記憶的最後一個鍵 - 值對條目進行迭代,你的值小於或等於至。然後,只要你找到一個比你的價值更大的鑰匙,就會停下來並返回。然而,我不知道這是什麼最好的C#數據結構 - SortedList?或者你可以從不同類型的字典中提取密鑰,對它們進行排序並遍歷它。 (理想情況下,您希望在沒有完成迭代的情況下找到最大不超過的關鍵字,例如樹狀結構,但我不知道這樣做的數據結構實現。) – Rup 2012-04-02 10:31:43

回答

3

您不能使用Dictionary<TKey,TValue>來做到這一點,因爲它不會保持訂單中的項目不變。但是你可以使用一個SortedDictionary<TKey, TValue>(或SortedList<TKey, TValue>)要做到這一點:

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; 
}