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

C# ordered dictionary object that supports finding closest key?

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

if (!Dictionary.ContainsKey(some_key)) 然后 return 下一个 key > some_key 基于字典的排序谓词?

如果有一个聪明的方法来与代表一起做这件事,我们将同样感激不尽!

正如 Vadim 所建议的,您最好的选择是 SortedDictionary 存储排序键的实现。从那里您可以执行以下操作:

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

dictionary.FirstOrDefault 将 return 大于所需键的第一个键值对。如果有none,那么一个空白的键值对是returned {,},值returned应该是存储类型的默认值。因为我在玩 SortedDictionary,所以它 returned 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;
        }
    }
}

Here is a great binary-search implementation for any sorted IList:如果确切的键不存在,它returns下一个最大键的~index

有了 class 在范围内,我们可以做如下的事情:

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
}