具有自定义搜索行为的类字典结构

时间:2013-01-23 05:49:33

标签: c# dictionary customization

我正在寻找一种可以搜索特定密钥的数据结构。关键是间隔。一旦将单个值传递给此结构,它应该找到正确的间隔(适当的密钥),然后该密钥可以指向其他几个值。

我搜索了多个值的一些键,发现了类似的东西:

Dictionary<double,LinkedList<T>>

但这里的关键值是一个简单的double,而不是interval类型。如果是间隔类型,我必须将间隔作为密钥传递。但是我需要根据单个值进行搜索并找到间隔。

换句话说,我们是否可以使用具有自定义搜索行为的字典结构?(例如将搜索作为Func&lt;,&gt;参数传递。)

3 个答案:

答案 0 :(得分:2)

我不知道这样的现有结构。但是有很多方法可以自己解决这个问题。首先想到的是为字典编写扩展方法,如下所示:

public static class DictionaryRangeExtensions
{
    public IEnumerable<T> FindValuesInRange(this Dictionary<double,T> dictionary, double lowerBound, double upperBound)
    {
         dictionary.Where(kvp=> kvp.Key > lowerBound && kvp.Key < uppoerBound).Select(kvp=>kvp.Value);
    }
}

答案 1 :(得分:2)

如果希望将范围作为关键字并按值查找,我认为这将作为关键:

public class Range
{
   public Range(double lower, double upper)
   {
       this.lower = lower;
       this.upper = upper;
   }

   public override Equals(object obj)
   {
       if(obj is double) return ((double)obj) > lower && ((double)obj) < upper;
       //sensibly complete this method
   }

   //also override GetHashcode, probably to use the hashcode of upper and lower
}

答案 2 :(得分:0)

对于非重叠区间,如果您可以将值映射到搜索到恒定时间间隔 - @tallseth建议,并将间隔作为普通字典中的键。

如果你必须搜索值落入的间隔 - 存储间隔为排序数组(由于间隔不重叠,因此可以轻松执行,因此为每对间隔定义了<)。比你二进制搜索找到间隔值落入。使用interval可以索引Dictionary或让数据包含“interval”,并使用approppriate函数从dat中选择间隔进行排序/散列。