我正在寻找一种可以搜索特定密钥的数据结构。关键是间隔。一旦将单个值传递给此结构,它应该找到正确的间隔(适当的密钥),然后该密钥可以指向其他几个值。
我搜索了多个值的一些键,发现了类似的东西:
Dictionary<double,LinkedList<T>>
但这里的关键值是一个简单的double,而不是interval类型。如果是间隔类型,我必须将间隔作为密钥传递。但是我需要根据单个值进行搜索并找到间隔。
换句话说,我们是否可以使用具有自定义搜索行为的字典结构?(例如将搜索作为Func&lt;,&gt;参数传递。)
答案 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中选择间隔进行排序/散列。