支持查找最近密钥的C#有序字典对象?

时间:2015-11-18 18:35:18

标签: c# .net dictionary data-structures ordereddictionary

C#中是否有任何有序的字典集合,如果找不到所需的值,它提供了一种现成的方法来查找大于某个值的第一个键?

即,if (!Dictionary.ContainsKey(some_key))然后根据字典的排序谓词返回下一个key > some_key

如果有一个聪明的方式与代表这样做,同样的一个例子将同样赞赏!

2 个答案:

答案 0 :(得分:2)

正如Vadim建议的那样,最好的选择是SortedDictionary实现,它存储已排序的密钥。从那里你可以做到以下几点:

var next = dictionary.ContainsKey(key)
                ? dictionary[key]
                : dictionary.FirstOrDefault(kvp => kvp.Key > key).Value;

dictionary.FirstOrDefault将返回键大于所需键的第一个键值对。如果没有,则返回空白键值对{,},返回的值应为存储类型的默认值。由于我正在使用SortedDictionary,它返回null。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var dictionary = new SortedDictionary<int, string> {{1, "First"}, {2, "Second"}, {10, "10th"}};
            Console.WriteLine(GetNext(1, dictionary));
            Console.WriteLine(GetNext(3, dictionary));
            Console.WriteLine(GetNext(11, dictionary));

            Console.ReadLine();
        }

        private static string GetNext(int key, SortedDictionary<int, string> dictionary)
        {
            return dictionary.ContainsKey(key)
                ? dictionary[key]
                : dictionary.FirstOrDefault(kvp => kvp.Key > key).Value;
        }
    }
}

答案 1 :(得分:1)

Here is a great binary-search implementation for any sorted IList:如果确切的密钥不存在,则会返回下一个最大密钥的~index

在范围内,该类可以执行以下操作:

SortedList myList;
int nextBiggestKey; // Index of key >= soughtValue
if((nextBiggestKey = myList.Keys.BinarySearch(soughtValue)) < 0)
{
   if(~nextBiggestKey > myList.Count) continue; // soughtValue is larger than largest key in myList
   nextBiggestKey = ~nextBiggestKey
}