查找最大的Dictionary <int,string>键,其值小于搜索值</int,string>

时间:2014-10-25 15:56:44

标签: c# dictionary

我有Dictionary<int,string>这样的升序键:

var myDictionary = new Dictionary<int,string>
{
    {750,"one"},
    {1500,"two"},
    {2500,"three"},
    {5000,"four"},
    {10000,"five"},
    {25000,"six"}
}

我有var myValue = 3000.52

我需要找到小于我的值的最大myDictionary键。在这种情况下,我需要返回2500。

我试过了:

foreach (var key in myDictionary.Keys.Where(key => key <= myValue))
{

}

但是,正如您所料,所有较小的值也匹配。

如何找到小于我的搜索值的最大密钥?

4 个答案:

答案 0 :(得分:7)

使用LinQ是我认为最简单的方法:

int myKey = myDictionary.Where(x => x.Key < myValue)
                        .OrderByDescending(x => x.Key)
                        .First().Key;

答案 1 :(得分:3)

您可以从字典键创建List<int>。如果你需要经常查找,我会存储这个列表。然后,您可以使用List.BinarySearch查找最近的密钥:

int key = 3000;
var keys = new List<int>(myDictionary.Keys);
// keys.Sort(); if it was not already sorted
var index = keys.BinarySearch(key);
if (index >= 0)
{
    // dictionary contains this key
}
else
{
    int nextSmaller = ~index - 1;
    string valueOfNextSmaller = myDictionary[keys[nextSmaller]]; // three
}
如果找到项目,

BinarySearch会返回已排序 List<T>中基于零的索引索引;否则,负数是下一个元素的索引的按位补码,大于项,或者,如果没有更大的元素,则为Count的按位补码。

答案 2 :(得分:1)

Giorgos&#39;答案是您能够使用Dictionary做的最好的,但它会很慢,因为这将搜索整个键空间。如果你想要快速的东西,C5集合库有许多缺乏.NET的功能。你可以这样做:

TreeDictionary<K,V> dict;
var last = dict.RangeTo(myValue).Backwards().First();

这将在O(log n)中执行,随着字典大小的增长,效率会更高。

答案 3 :(得分:0)

您可以使用整数来跟踪最高值。

int temp = 0;
foreach (var key in myDictionary.Keys)
{
    if (key > temp) { temp = key; }
}
if (searchvalue > temp) { // invalidate search}
//Do something with temp here.