c# - 根据范围数据查找值

标签 c# .net

什么数据结构或数据类型适合保存数据范围,并根据该范围内的数据返回一个值?

例如,假设我有以下范围

1-10 -> 1  
11-35 -> 2.5  
36-49-> 3.8  
50-60 -> 1.2  
61-80 -> 0.9 

在本例中,给定数字 41,我希望返回数字 3.8(因为 41 在 36 和 49 的范围之间)。

是否有一种巧妙的方法在数据结构中表示此类数据以执行此查找?

最佳答案

一个相对方便且非常高性能的实现是使用 SortedList<int, Tuple<int, double>> 。使用每个段的下界作为键,使用上限 + 映射值的元组作为值:

var list = new SortedList<int, Tuple<int, double>>
{
    { 1, Tuple.Create(10, 1.0) },
    { 11, Tuple.Create(35, 2.5) },
};

(当然,您可以决定使用更好看的数据结构来声明参数,以增强代码的可维护性,并在开始工作之前在内部转换为该结构)。

list.Keys保证已排序,查找值时可以使用 binary search在其上查找等于或大于您的输入值的索引:

var index = list.Keys.BinarySearch(value);
if (index < 0 && ~index == 0) {
    // no match, stop processing
}
else if (index < 0) {
    // key not found as is, look at the previous interval
    index = ~index - 1;
}

此时index点可能包含 value 的唯一范围,所以剩下的就是测试一下:

if(x >= list.Keys[index] && x <= list.Values[index].Item1) {
    var result = list.Values[index].Item2;
}
else {
    // no match
}

你不会称其为“干净”,但它非常短且非常快。

关于c# - 根据范围数据查找值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12855270/

相关文章:

c# - ASP.NET 自定义控件 - 复合

c# - 如何告诉nuget将包资源文件添加为链接,而不是将它们复制到项目目录中

c# - 使用 System.Linq.Expressions API 重写 Lambda 表达式

c# - 在文本框中输入字符时显示 div 标签内容?

.net - 如何使 WSDL.exe 不生成 XxxAsync 方法(我仍然想要 Begin/EndXxx)

c# - 遍历字典对象

c# - 源代码混淆

c# - 从隐藏代码打开新的 Outlook 电子邮件 - 按钮对齐问题

c# - Xamarin Android 绑定(bind)库 - 不在 DigitalPersona UareU JAR 中实现继承的抽象成员

.net - 共享服务器 IIS 8.5 中的子网站