c# - 从字典中查找闭合值

标签 c# linq

您好,我正在尝试按指定值从字典中查找最接近的值(需要为 2),但似乎我无法找到工作解决方案。

第一次尝试使用静态范围查找值,但意识到如果值差异高于指定范围,我的代码将返回错误的值,所以我被迫返回“绘图板”

Dictionary<double,double> valueDictionary = new Dictionary<double, double>();
valueDictionary.Add(0,10);
valueDictionary.Add(1, 25);
valueDictionary.Add(2, 35);
valueDictionary.Add(3, 55);
valueDictionary.Add(4, 100);


double valueToFind = 40;
var result = valueDictionary.Values.Where(t => t >= valueToFind - 10 && t <= valueToFind + 10).ToDictionary(t=> t,v=>v);
Debug.WriteLine("Result "+result.Count);

如果我们搜索值 40,那么它必须返回 35 和 55

valueDictionary.Add(2, 35);
valueDictionary.Add(3, 55);

如果我们搜索值 60,那么它必须返回 55 和 100

valueDictionary.Add(3, 55);
valueDictionary.Add(4, 100);

但是如果我们搜索值 55,那么它必须返回索引 id,即 3

感谢您的帮助。

不是最好的解决方案,但它完成了它的工作,只是想知道是否可以在此解决方案上使用 linq

double valueToFind = 40;

MyObject minimum = new MyObject(){Y= 0,X = 0};// define minimum range
MyObject maximum = new MyObject(){Y = 100, X = 100}; //define maximum range

foreach (var child in tempList)//your collection
{
    if (child.X <= valueToFind)// try to find lower values from our valueToFind variable
    {
         if (child.Y >= minimum.X)//if value is higher than our lower value, it means its close to our searching minimum value
         {
                        minimum.Y = child.Y;
                        minimum.X = child.X;
         }
    }
    else if (child.X >= valueToFind) // try to find higher values from our valueToFind variable
    {
         if (child.X <= maximum.X) //if value is lower than our higher value, it means its close to our searching maximum value
         {
               maximum.Y = child.Y;
               maximum.X = child.X;
         }
    }
  }

Debug.WriteLine("Found variables");
Debug.WriteLine(minimum.X + " " + minimum.Y);
Debug.WriteLine(maximum.X + " " + maximum.Y);

public class MyObject
{
   public double X { get; set; }

   public double Y { get; set; }
}

最佳答案

使用List.BinarySearch,您可以查找匹配值或最接近的值:

var values = new List<double>() { 10, 25, 35, 55, 100 };

var valueToFind = 60.0;

var findIndex = values.BinarySearch(valueToFind);
double lowValue, highValue;

bool found = findIndex >= 0;
if (!found) {
    var highIndex = -findIndex - 1;
    var lowIndex = Math.Max(highIndex - 1, 0);
    highIndex = Math.Min(highIndex, values.Count - 1);
    lowValue = values[lowIndex];
    highValue = values[highIndex];
}

注意:List 必须经过排序才能使 BinarySearch 正常工作。

关于c# - 从字典中查找闭合值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55383232/

相关文章:

c# - 我的数据库的每个表都需要一个类吗?

c# linq to xml 错误 : cannot implicitly convert type

c# - 同步播放FLV数据

c# - 如何将变量传递给重写的 toString() 方法?

c# - 是否可以创建无论电池状态如何都保持事件状态的 UWP 服务?

c# - 比较很多变量的最有效方法? C#

c# - LINQ to Entities 如何更新记录

c# - Android:如何构造*完整*路径以传递给 Intent.CreateChooser

c# - 委托(delegate)中的方法参数

c# - 在 Linq select 子句中重用表达式(查询格式)