我有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))
{
}
但是,正如您所料,所有较小的值也匹配。
如何找到小于我的搜索值的最大密钥?
答案 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.