2012-04-02 28 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; 
}